我正在尝试学习C ++,并编写了这段代码。根据我的理解,此代码需要生成输出"Derived Class"
,但输出为"Base Class"
。
请帮我理解这一点。
#include <iostream>
using namespace std;
class Base {
public:
char* name;
void display() {
cout << name << endl;
}
};
class Derived: public Base {
public:
char* name;
void display() {
cout << name << ", " << Base::name << endl;
}
};
int main() {
Derived d;
d.name = "Derived Class";
d.Base::name = "Base Class";
Derived* dptr = &d;
Base* bptr = dptr;
bptr->display();
}
请将我视为初学者并解释其输出为"Base Class"
答案 0 :(得分:2)
您需要制作display()
方法virtual
像这样:
class Base{
public:
char* name;
virtual void display() {
cout << name << endl;
}
virtual
允许派生类覆盖&#39;基类&#39;功能
答案 1 :(得分:0)
http://www.parashift.com/c++-faq/dyn-binding.html
静态解析非虚拟成员函数。那就是 成员函数是基于静态选择的(在编译时) 对象的指针(或引用)的类型。
相比之下,虚拟成员函数是动态解析的(at 运行)。也就是说,动态选择成员函数(at 运行时)基于对象的类型,而不是类型 指针/对该对象的引用。
答案 2 :(得分:0)
如果希望通过基类指针调用派生类函数,则需要使基类函数成为虚函数。将关键字virtual添加到函数中,您的代码就可以了。
答案 3 :(得分:0)
C ++调度有点奇怪。除非你声明显示方法&#39;虚拟&#39; bptr-&gt;显示将总是调用基类的显示。
更详细的解释是here
答案 4 :(得分:0)
多态性(通常与指向派生类实例的基类指针一起工作)通过调度到其他答案中解释的虚函数来完成。但是,如果指向具有基类指针的派生类,则将使用基类的数据成员,因为编译器不知道派生类的数据成员,并且同样适用于基类的调用函数,所以基类display()
函数使用基类name
数据成员,结果是“基类”。