我正在使用代码,我看到一些奇怪的东西,一个类“MyClass”的方法让我们称之为X():
virtual void X() = 0;
所以MyClass是一个抽象类,在MyClass.cpp中X()有一个正确的实现...... 在MyClass的派生类中,此方法通过MyClass :: X();
调用我认为= 0
会使其实现无效......但事实并非如此,实际上它在派生类中是可用的。
你能告诉编译器遇到= 0
时真正做了什么吗?
答案 0 :(得分:2)
来自标准(9.2班级成员[class.mem]):
{ countryCodes: [{ text: 'United States', value: 'US' }, ... }
是= 0
它告诉编译器:
如果我理解你的问题,你会有类似的事情:
pure-specifier
如果是这样,构建应该失败:
class MyClass {
public:
virtual void X() = 0;
};
class MyDerivedClass : MyClass {
public:
virtual void X();
};
void MyDerivedClass::X() { MyClass::X(); }
int main()
{
MyDerivedClass mdc;
mdc.X();
return 0;
}
但是,即使方法undefined reference to 'MyClass::X()'
被声明为纯虚拟,
你可以提供一个定义。以下是有效的。班级MyClass::X()
仍然是抽象,但您可以调用方法MyClass
。
MyClass::X()
#include <iostream>
class MyClass {
public:
virtual void X() = 0; // pure virtual method
};
class MyDerivedClass : MyClass {
public:
virtual void X();
};
void MyClass::X() { // pure virtual method definition
std::cout << "MyClass::X()" << std::endl;
}
void MyDerivedClass::X() {
MyClass::X();
std::cout << "MyDerivedClass::X()" << std::endl;
}
int main()
{
MyDerivedClass mdc;
mdc.X();
return 0;
}
答案 1 :(得分:2)
= 0的事告诉编译器两件事:
答案 2 :(得分:0)
您无法使用纯虚方法创建类的实例,但在某些情况下,您可以调用纯虚方法,它将是error
答案 3 :(得分:0)
我认为编译器为纯虚方法创建了一个带有NULL指针的vtable。