具有子成员的C ++子类

时间:2019-03-20 05:43:02

标签: c++ class inheritance

我想记住我的C ++。我不确定该怎么做。我有一个父母班和一个孩子班。父级具有一个成员,该成员引用了另一个其他对象的实例…子类具有对该另一个对象的子版本的引用。

基本上,我希望有一个Parent类,该类将指示其将具有的成员类型,以及全局成员函数以及必须由子类定义的虚拟成员函数。

但是,某些子类可能需要特定类型的成员对象,该成员对象继承父类型。这是一个例子。

我们有一个Person,由BigPerson继承。 我们有一个由BigHome继承的房屋。

我希望Person类表示它具有一个Home,但是,BigPerson应该具有一个BigHome(仍然是Home)。

#include <iostream>

using namespace std;


class Home {
    public:

    virtual string sayHome()
    {
        cout << "Home";
    }
};

class BigHome : public Home
{
    public:
    int num = 5;
    virtual string sayHome() override
    {
        cout << "Big Home " << this->num;
    }

};


class Person
{
    public:

    Home& home;

    Person(Home& home) : home(home) {}

    virtual void sayHello()
    {
        cout << "hello";
    }

    virtual void talk()
    {
        this->sayHello();
        cout << ", I have a ";
        this->home.sayHome();
        cout << endl;
    }
};

class BigPerson : public Person
{
    public:

    BigPerson(BigHome& bigHome) : Person(bigHome) { }

    virtual void sayHello() override
    {
        cout << "big hello " << home.num;
    }
};




int main()
{
    Home home;
    BigHome bigHome;
    bigHome.num = 7;
    //*
    Person p(home);
    BigPerson bp(bigHome);
    //*
    p.talk();    
    bp.talk();
    //*/
    return 0;
}

我得到的错误是:

main.cpp: In member function ‘virtual void BigPerson::sayHello()’:
main.cpp:65:44: error: ‘class Home’ has no member named ‘num’
         cout << "big hello " << this->home.num;
                                            ^

1 个答案:

答案 0 :(得分:0)

class Person具有类型home的成员class Home &。在编译时绑定不知道是引用Home还是BigHome对象,因此不可能指向BigHome的成员。

一种可能的解决方法是使用dynamic castassert进行类型检查和static cast

BigHome *p = dynamic_cast<BigHome *>(&home);
assert(p != nullptr);
cout << "big hello " << p->num;