虚函数签名不匹配及其行为

时间:2017-02-16 16:28:06

标签: c++ constructor destructor virtual-functions

我正在查看虚函数行为的示例。鉴于此测试代码,我对其行为有一些疑问。

class A
{
public:
    A(int x)
    {
        cout << "In A Constructor" << endl;
        print();
    }
    ~A(){
        cout << "In A Destructor" << endl;
        delete _val;
    }
    virtual void print() { cout << "A." << endl; }
private:
    char* _val;
};

class B: public A
{
public:
    B(int x, int y) : A(x)
    {
        _dVal = new char[y];
        cout << "In B Constructor 1" << endl;
        print();
    }
    B() : A(0)
    {
        _dVal = new char[1];
        cout << "In B Constructor 2" << endl;
        print();
    }
    ~B(){
        cout << "In B Destructor" << endl;
        delete _dVal;
    }
    void print() { cout << "B" << endl; }
private:
    char* _dVal;
};

int main(int argc, char** argv) {
    A* p1 = new B();
    p1->print();
    delete p1;
    return 0;
}

输出结果为:

In A Constructor
A.
In B Constructor 2
B
B
In A Destructor

1)如果A类是唯一一个将其表示为虚函数并且由dereference( - &gt;)调用的,为什么要打印B类? 2)如果构造函数实际上被调用,为什么B的析构函数永远不被调用?

1 个答案:

答案 0 :(得分:4)

  

1)如果A类是唯一一个将其表示为虚函数并且由dereference( - &gt;)调用的,为什么要打印B类?

虚拟功能应该做什么。指针p1的类型为A*,但它实际上指向了B类型的对象。此动态绑定仅在使用指针或对基类的引用处理派生类时发生。

另请注意,派生类中的重写函数也是virtual(无论关键字virtual是否在其声明中使用)。

  

2)如果构造函数实际上被调用,为什么B的析构函数永远不被调用?

B的析构函数未被调用,因为您未将基类的析构函数(即A::~A)声明为virtual destructor。对于这种情况,行为是未定义的。调用B的构造函数是因为您B明确构造了new B()