假设我有两个c ++类。
#include <iostream>
class base
{
public:
void show()
{
std::cout<<"In base show";
}
};
class derived
{
public:
void show()
{
std::cout<<"In derived show";
}
};
int main()
{
base *bptr = new derived();
bptr->show();
}
为什么总是将其称为show show.base指向派生对象的指针?
答案 0 :(得分:0)
main.cpp: In function ‘int main()’:
main.cpp:23:29: error: cannot convert ‘derived*’ to ‘base*’ in initialization
base *bptr = new derived();
这是您应该遇到的编译器错误。您的课程derived
实际上不是派生的。您需要从base
继承。
class derived : public base {
// your implementation
}
然后,您的代码将被编译,但是当您运行它时,它仍将显示来自基类的消息。如评论中所述,必须将可以通过继承类覆盖的方法声明为virtual
,这指示编译器生成vtable,以便可以在运行时调用正确的方法。
class base
{
public:
virtual void show()
{
std::cout<<"In base show";
}
};
将派生类中的方法标记为override
也是一种很好的样式。在非虚拟方法上使用重写将导致编译器错误,即您错过的关键字。让编译器告诉您您的错误,这就是它的工作。
class derived : public base
{
public:
void show() override
{
std::cout<<"In derived show";
}
};