|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <iostream>
- #include <string>
- class Base
- {
- public:
- void f(int x) //加不加virtual都一样
- {
- std::cout<< "基类" << x << std::endl;
- }
- };
- class Derived : public Base
- {
- public:
- void f(std::string name)
- {
- std::cout<< "子类" << name << std::endl;
- }
- };
- int main()
- {
- Base *pTest1 = new Derived;
- Derived *pTest2 = new Derived;
- pTest1->f(10);
- // pTest2->f(10); //会报错,虚函数也起不到作用
- pTest2->f("旺财");
- // pTest1->f("旺财");
- return 0;
- }
复制代码 个人原来是这么想的:Base *pTest1 = new Derived;是按子类Derived的大小给pTest1分配内存,然后按基类Base给pTest1初始化,所以pTest1指向的地址块中只有void f(int x) ,没有void f(std::string name),于是pTest1->f(10)对应到void f(int x),而
pTest1->f("旺财")报错;
相应的Derived *pTest2 = new Derived;是按子类Derived的大小给pTest2分配内存,然后按子类Derived给pTest2初始化,又因为子类Derived是继承基类Base来的,所以pTest2指向的地址块中有void f(std::string name),也有void f(int x) ,但由于参数不同,子类函数void f(std::string name)把基类函数void f(int x)隐藏了。所以pTest2只看得到void f(std::string name),故pTest2->f("旺财")对应到void f(std::string name),pTest2->f(10)报错。
但下面的代码好像又不符合上面的说法。
- #include <iostream>
- class Base
- {
- public:
- virtual void f(int x) //虚函数
- {
- std::cout<< "基类" << x << std::endl;
- }
- };
- class Derived : public Base
- {
- public:
- void f(int x)
- {
- std::cout<< "子类" << x<< std::endl;
- }
- };
- int main()
- {
- Base *pTest1 = new Derived;
- Derived *pTest2 = new Derived;
- pTest1->f(10);
- pTest2->f(10);
- return 0;
- }
- //结果为:子类10
- 子类10
复制代码 从这个代码看来:pTest1指向的地址块中有基类函数void f(int x) ,同时也有子类函数void f(int x)。
再变下代码:
- #include <iostream>
- class Base
- {
- public:
- virtual void f(int x)
- {
- std::cout<< "基类" << x << std::endl;
- }
- };
- class Derived : public Base
- {
- public:
- void function(int x)
- {
- std::cout<< "子类" << x<< std::endl;
- }
- };
- int main()
- {
- Base *pTest1 = new Derived;
- Derived *pTest2 = new Derived;
- pTest1->function(10);
- // pTest2->function(10);
- return 0;
- }
- //报错:error C2039: 'function' : is not a member of 'Base'
复制代码 从这个代码看,pTest1指向的地址块中只有基类函数void f(int x) ,没有子类函数void function()。
综合上面三个代码来看,刚开始的想法应该是对的。只所以第二个代码中pTest1指向的地址块中有基类函数void f(int x) ,同时也有子类函数void f(int x),是因为这里的子类函数void f(int x)和基类函数void f(int x)本身是一个函数,只不过是子类函数void f(int x)覆盖了基类函数void f(int x)。而第一个代码和第三个代码中的子类函数和基类函数是不同的两个函数,第一个代码中编译器根据参数来区别两个函数,第三个代码中编译器根据函数名来区别两个函数。
|
|