使用在派生类中声明为pure virtual的方法

时间:2016-01-27 10:23:36

标签: c++ oop virtual derived-class

我正在使用代码,我看到一些奇怪的东西,一个类“MyClass”的方法让我们称之为X():

virtual void X() = 0;

所以MyClass是一个抽象类,在MyClass.cpp中X()有一个正确的实现...... 在MyClass的派生类中,此方法通过MyClass :: X();

调用

我认为= 0会使其实现无效......但事实并非如此,实际上它在派生类中是可用的。

你能告诉编译器遇到= 0时真正做了什么吗?

4 个答案:

答案 0 :(得分:2)

来自标准(9.2班级成员[class.mem]):

  

{ countryCodes: [{ text: 'United States', value: 'US' }, ... } = 0

它告诉编译器:

  1. 该课程是 abstract
  2. 该方法将在外部定义类定义 (通常在派生类中)
  3. 示例1(构建失败)

    如果我理解你的问题,你会有类似的事情:

    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;    
    }
    

    示例2(构建成功)

    但是,即使方法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的事告诉编译器两件事:

  1. 不需要定期的类外函数定义(虽然允许)。如果没有这样的定义,并且实际调用了该函数,则这是一个runtine错误。
  2. 该类是抽象的,无法实例化,无论是否存在第1点的定义。尝试这样做应该被标记为编译时错误。不会覆盖该函数的派生类也是抽象的。

答案 2 :(得分:0)

您无法使用纯虚方法创建类的实例,但在某些情况下,您可以调用纯虚方法,它将是error

答案 3 :(得分:0)

我认为编译器为纯虚方法创建了一个带有NULL指针的vtable。