关于ctors和继承

时间:2016-09-04 20:01:43

标签: c++

我是C ++的新手。 我有一个作业,我应该实现c类'默认ctor和cctor,以便它们分别打印“c :: ctor”和“c :: cctor”。 我不知道如何处理这个,帮助将不胜感激。

#include <iostream>
#include <string>
using namespace std;

class a {
public:
    a(const char* sname)
        :  _sname(sname) {
        cout << "a::ctor" << endl;
    }
    a(const a& s) { cout << "a::copy ctor" << endl; }
    virtual ~a() { cout << "a::dtor " << endl; }
    void f1() { cout << "a::f1()" << endl; f2(); }
    virtual void f2() = 0;
private:
    string _sname;
};

class b1 : virtual public a {
public:
    b1(const char* saname, const char* ssname)
        : _sname1(saname), a(ssname) {
    }
    b1(const b1& b1) : a(b1) { cout << "b1 :: copy ctor << endl"; }
    ~b1() { cout << "b1::dtor" << endl; }
    virtual void f1() { cout << "b1::f1()" << endl; }
    virtual void f2() { cout << "b1::f2()" << endl; }
    virtual void f3() { cout << "b1::f3()" << endl; }
private:
    string _sname1;
};

class b2 : virtual public a {
public:
    b2(const char* saname, const char* ssname)
        : _sname2(saname), a(ssname) {
        cout << "b2::ctor" << endl;
    }
    b2(const b2& b2) : a(b2) { cout << "b2::copy ctor" << endl; }
    ~b2() { cout << "b2::dtor" << endl; }
    virtual void f3() { f1(); cout << "b2::f3()" << endl; }
private:
    string _sname2;
};

class c : public b1, public b2 {
public:
    c();
    c(const c& c);
    ~c() { cout << "c::dtor" << endl; }
    virtual void f1() { a::f1(); cout << "c::f1()" << endl; }
    void f3() { cout << "c::f3()" << endl; }
};

1 个答案:

答案 0 :(得分:1)

在虚拟继承的情况下,构造函数和析构函数的事情更复杂。还应在a类中调用虚拟基类c的构造函数和析构函数,因为编译器无法在b1b2之间进行选择以构建(唯一) a部分位于c对象中。对于析构函数,编译器处理调用b1的析构函数,b2的析构函数和a的析构函数。

所以你应该实现

class c : public b1, public b2 {
public:
  c() : b1("", ""), b2("", ""), a("") {}
  c(const c& src) : b1(src), b2(src), a(src) {}
};

通常,您应该在不必要时尝试避免虚拟继承。但要理解它是如何工作的,这是一个很好的练习。