多级继承和纯虚函数

Dee*_*epu 3 c++

包含纯虚函数的类不能包含对象.这是我对纯虚函数的看法.我有以下程序,它编译没有任何错误.

#include<iostream>

using namespace std;

class Father {
   public:
   virtual void foo()=0;
};

class Son:public Father {
  // Nothing here 
};

int main() {

}
Run Code Online (Sandbox Code Playgroud)

这是预期的,因为这两个类都没有对象.但是当我试图从包含纯虚函数的类中获得多级继承时,下面的程序给了我错误.

#include<iostream>

using namespace std;

class Father {
   public:
   virtual void foo()=0;
};

class Son:public Father {
  // Nothing here
};

class Grand_Son:public Son {
    void foo() {
        cout<<"\nFunction foo From Grand_Son\n";
    }
};

int main() {
   Grand_Son x;
   x.foo();
}
Run Code Online (Sandbox Code Playgroud)

错误如下所示.

In function 'int main()':|
|error: 'virtual void Grand_Son::foo()' is private|
|error: within this context|
||=== Build finished: 2 errors, 0 warnings ===|
Run Code Online (Sandbox Code Playgroud)

错误是意外的,因为我继承了类SonGrand_Sonas public.

是否可以使用涉及纯虚函数的类进行多级继承?

有什么建议?谢谢.

Mat*_*son 7

class Grand_Son:public Son {
   public:
---^^^^^^^
    void foo() {
        cout<<"\nFunction foo From Grand_Son\n";
    }
};
Run Code Online (Sandbox Code Playgroud)

你没有宣布foo公开 - 我在上面添加了它.


Sal*_*gar 6

你有foo()私人部分Grand_Son

classc ++中的默认访问权限private与您继承的方式无关(public/private/protected/default).

不仅如此,你实际上并没有使用这个例子的任何继承特性,因为你在这里使用一个具体的子类,所以它与虚拟无关.

class Grand_Son:public Son {
    public: <------- This will fix your compiler problem.
    void foo() {
        cout<<"\nFunction foo From Grand_Son\n";
    }
};
Run Code Online (Sandbox Code Playgroud)

或者这应该有效,因为您将在基类上以多态方式使用该类,它将根据基类中的访问级别执行v表查找.您应该在整个层次结构中与您的访问级别保持一致.

int main() {
   Father* x = new Grand_Son();
   x->foo();
}
Run Code Online (Sandbox Code Playgroud)