Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果两个基类中的方法相同。哪一个不是虚拟的,如果我们从使用基指针调用总是调用基方法? 假设我有两个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++ - Fatal编程技术网

如果两个基类中的方法相同。哪一个不是虚拟的,如果我们从使用基指针调用总是调用基方法? 假设我有两个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";
   }
};