C++ 虚继承

如果不虚继承的话,父类对象每一次被调用都会被初始化

#include <iostream>
/**
 * C++多重继承
 */

using namespace std;
class Person {
public:
    Person(string color="blue");
    virtual ~Person();
    void printColor();
protected:
    string m_strColor;
};
//虚继承
class Farmer :virtual public Person{
public:
    Farmer(string name = "jack",string color="blue");

    ~Farmer();

    void sow();

protected:
    string m_strName;
};
//虚继承
class Worker :virtual public Person{
public:
    Worker(string code = "001",string color="bule");

    virtual ~Worker();

    void carry();

protected:
    string m_strCode;
};

void Worker::carry() {
    cout << m_strCode << endl;
    cout << "Worker::carry()" << endl;
}

class MigrantWorker : public Farmer, public Worker {
public:
    MigrantWorker(string name, string age,string color);

    ~MigrantWorker();
};


Person::Person(string color) {
    m_strColor=color;
    cout << "Person()" << endl;
}
void Person::printColor() {
    cout << m_strColor << endl;
    cout << "Person::printColor()" << endl;
}
Person::~Person() {
    cout << "~Person()" << endl;
}

Farmer::Farmer(string name,string color):Person(color) {
    m_strName = name;
    cout << "Farmer()" << endl;
}

Farmer::~Farmer() {
    cout << "~Farmer()" << endl;
}

void Farmer::sow() {
    cout << m_strName << endl;
    cout << "Farmer::sow()" << endl;
}

Worker::~Worker() {
    cout << "~Worker()" << endl;
}

Worker::Worker(string code,string color):Person(color){
    m_strCode = code;
    cout << "Worker()" << endl;
}

MigrantWorker::MigrantWorker(string name, string code,string color) : Farmer(name,color), Worker(code,color) {
    cout << "MigrantWorker()" << endl;
}

MigrantWorker::~MigrantWorker() {
    cout << "~MigrantWorker()" << endl;
}

int main() {
    MigrantWorker *migrantWorker = new MigrantWorker("kitty", "002","green");
    migrantWorker->carry();
    migrantWorker->sow();
    delete (migrantWorker);
    return 0;
}

不加virtual关键词 输出结果

Person 被初始化了两次
Person()
Farmer()
Person()
Worker()
MigrantWorker()
002
Worker::carry()
kitty
Farmer::sow()
~MigrantWorker()
~Worker()
~Person()
~Farmer()
~Person()

猜你喜欢

转载自www.cnblogs.com/wuyanzu/p/11874382.html