簡體   English   中英

使用Diamond of death進行C ++打印

[英]C++ printing with Diamond of death

首先讓我解釋一下我的等級:

        Person
       /     \
   Student Employee
       \     /
       Intern

每個類都有自己的output函數,它打印其數據成員,我只需打印一次Person 問題是StudentEmployee不是抽象類,人們也會創建一個類型的對象,所以我不僅可以在Intern級別調用輸出函數。

正如您將在下面的代碼中看到的那樣,我已經設法解決了這個問題,但我認為這很難看並且不是非常多態的。 我已經創建了一個額外的輸出函數,因此它適用於所有情況。 有沒有更好的方法來實現這一目標?

class Person {
    string name;
    int id;
public:
        virtual void output(ostream& out) {
        out << name << "," << id;
    }
}

學生:

class Student : virtual public Person {
    string major;
    int year;
public:
    virtual void output(ostream& out) {
        Person::output(out);
        out << "," << major << "," << year;
    }
    virtual void outputStudOnly(ostream& out) {
        out << "," << major << "," << year;
    }
};

雇員:

class Employee : virtual public Person{
    string jobTitle;
public:
    virtual void output(ostream& out) {
        Person::output(out);
        out << "," << jobTitle;
    }
    virtual void outputEmpOnly(ostream& out) {
        out << "," << jobTitle;
    }
};

實習生:

class Intern : public Student, public Employee {
public:
    virtual void output(ostream& out) {
        Person::output(out);
        Student::outputStudOnly(out);
        Employee::outputEmpOnly(out);
    }
};

那是什么模板方法。 以下是我將如何編寫此代碼:

class Person {
    string name;
    int id;
public:
        void output(ostream& out) {
        out << name << "," << id;
        output_impl(out);
    }
private:
       virtual void output_impl(ostream& ) {}
};

class Student : virtual public Person {
    string major;
    int year;
private:
    virtual void output_impl(ostream& out) {
        out << "," << major << "," << year;
    }

};

class Employee : virtual public Person {
    string jobTitle;
private:
    virtual void output_impl(ostream& out) {
        out << "," << jobTitle;
    }
};

class Intern : public Student, public Employee {
private:
    virtual void output_impl(ostream& out) {
        Student::output_impl(out);
        Employee::output_impl(out);
    }
};

而且你在對象上調用output

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM