如果有人能启发我这里发生了什么,我将不胜感激:假设我声明以下内容
class Base {
public:
virtual void member(Base b) = 0;
};
Run Code Online (Sandbox Code Playgroud)
这给出了以下编译器错误:
pvf.cpp:3:18: error: cannot declare parameter ‘b’ to be of abstract type ‘Base’
virtual void member(Base b) = 0;
^
pvf.cpp:1:7: note: because the following virtual functions are pure within ‘Base’:
class Base {
^
pvf.cpp:3:18: note: virtual void Base::member(Base)
virtual void member(Base b) = 0;
Run Code Online (Sandbox Code Playgroud)
但是,如果我通过引用传递,它编译没有问题:
class Base {
public:
virtual void member(Base& b) = 0;
};
Run Code Online (Sandbox Code Playgroud)
此外,我想在派生类中实现 member() 作为
class Base {
public:
virtual void member(Base& b) = 0;
};
class Derived : public Base {
public:
void member(Derived& d) {};
};
int main() {
Derived d;
}
Run Code Online (Sandbox Code Playgroud)
但是,(显然?)我得到
pvf.cpp: In function ‘int main()’:
pvf.cpp:12:14: error: cannot declare variable ‘d’ to be of abstract type ‘Derived’
Derived d;
^
pvf.cpp:6:8: note: because the following virtual functions are pure within ‘Derived’:
class Derived : public Base {
^
pvf.cpp:3:15: note: virtual void Base::member(Base&)
virtual void member(Base& b) = 0;
Run Code Online (Sandbox Code Playgroud)
你的第一个函数
virtual void member(Base b) = 0;
Run Code Online (Sandbox Code Playgroud)
按值获取类的参数Base,需要将的实例Base传递给它。但由于Base它是一个抽象类(因为它包含一个纯虚函数),因此它无法实例化,因此您无法创建一个实例来Base传递给它!这就是你的第一个错误的原因。
在第二种情况下,在派生类中声明一个函数
void member(Derived& d) {};
Run Code Online (Sandbox Code Playgroud)
您可能认为它覆盖了基类虚函数
virtual void member(Base& b) = 0;
Run Code Online (Sandbox Code Playgroud)
但它没有(事实上,它隐藏了它 - 请参阅为什么虚函数会被隐藏?以获得对此的解释),因此Derived仍然是抽象类,因为您没有在基类中提供纯虚函数的实现。由于这个原因Derived也无法实例化。无法为基类纯虚函数提供实现的派生类将像基类一样保持抽象状态。