2016-09-04 3 views
-6

C는 C++에 대한 새로운 내용입니다. C 클래스의 기본 ctor와 cctor를 구현해야하는 과제가있어서 "c :: ctor"와 "c :: cctor"가 각각 인쇄됩니다. 이 문제를 어떻게 처리해야할지 모르겠다면 도움을 받으실 수 있습니다.ctor 및 상속에 관하여

#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; } 
}; 
+0

이해가 안됩니다. 'a1, b1, b2' 클래스에는 모두 여러분의 요구 사항을 만족시키는 복사 생성자가 있습니다. 왜 'c'클래스와 같은 일을 할 수 없니? 예 :'C (const c & variable) {cout << "c :: copy constructor \ n";}' –

+0

컴파일러는 클래스 A에 대한 기본 ctor가 없다고 말합니다. – Hellowuvrld

답변

1

가상 상속의 경우 생성자와 소멸자가 더 복잡합니다. 가상베이스 클래스 a의 생성자와 소멸자는 컴파일러가 개체에 (고유 한) a 부분을 작성하기 위해 b1 또는 b2 중에서 선택할 수 없기 때문에 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) {} 
}; 

를 구현해야합니다, 당신은 때 필요하지 가상 상속을 피하려고한다. 그러나 그것이 어떻게 작동하는지 이해하는 것은 좋은 운동입니다.