如果两个基类中的方法相同。哪一个不是虚拟的,如果我们从使用基指针调用总是调用基方法? 假设我有两个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(); } #包括 阶级基础 { 公众: 无效显示() { 标准::cout
这是您应该得到的编译器错误。您的类如果两个基类中的方法相同。哪一个不是虚拟的,如果我们从使用基指针调用总是调用基方法? 假设我有两个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(); } #包括 阶级基础 { 公众: 无效显示() { 标准::cout,c++,C++,这是您应该得到的编译器错误。您的类派生的实际上不是派生的。您需要从基继承 class derived : public base { // your implementation } 然后,您的代码将被编译,但当您运行它时,它仍将显示来自基类的消息。如注释中所述,您必须将继承类可以覆盖的方法声明为virtual,这将指示编译器生成vtable,以便在运行时调用正确的方法 class base { public: virtual void show() {
派生的
实际上不是派生的。您需要从基继承
class derived : public base {
// your implementation
}
然后,您的代码将被编译,但当您运行它时,它仍将显示来自基类的消息。如注释中所述,您必须将继承类可以覆盖的方法声明为virtual
,这将指示编译器生成vtable,以便在运行时调用正确的方法
class base
{
public:
virtual void show()
{
std::cout<<"In base show";
}
};
因为您对基类有一个指针。编译器不知道任何可能的子类及其函数,这不是C++如何工作的。多态是一个运行时的事情,并且由于函数不是<代码>虚拟< /代码>,编译器将不会生成需要的整个虚拟和多态的运行时代码。但基指针指向派生对象,这对我来说是个困惑。编译器是如何解析的?问题是,编译器不会解析它。编译器不会知道哪个子类(如果有的话)指针可能指向,它只知道bptr
是指向base
类的指针,因此将调用base::show
@AbhayFegade如果需要虚拟多态性,请使用virtual
函数成员。另一种方法是使用CRTP进行静态多态性。
class base
{
public:
virtual void show()
{
std::cout<<"In base show";
}
};
class derived : public base
{
public:
void show() override
{
std::cout<<"In derived show";
}
};