基类对象访问派生类资源时出错。

问题描述 投票:0回答:1

我有一个叫做Base的基类和一个叫做Derived的派生类,一个基类指针可以指向一个派生类对象,也可以访问它的资源,但是我在做同样的事情时得到一个错误。

class Base
{
public:
    int a;
};

class Derived : public Base
{
public:
    float b;
    void DoSomething()
    {
         cout<<"Derived";
    }
};

int main()
{
    Base * pBase = new Derived();
    pBase->DoSomething();
    pBase->a = 5; 
    pBase->b = 0.2f; 
    return 0;
}

这给了我一个错误

main.cpp: In function ‘int main()’:
main.cpp:34:25: error: ‘class Base’ has no member named ‘DoSomething’
     pBase->DoSomething();
                         ^
main.cpp:36:12: error: ‘class Base’ has no member named ‘b’
     pBase->b = 0.2f;
            ^

如果太过基础,请原谅我,我是一个C++初学者。

c++ pointers inheritance derived-class base-class
1个回答
1
投票

是的,你可以使用一个 Base 指针 Derived 尽管如此, Base 指针必须知道方法,以便选择最适合调用的方法,如果这个 Base 指针不知道这些变量和函数的存在,它不能调用它们。

更正后的代码:

class Base
{
public:
    int a;
    float b;
    virtual ~Base(){} //virtual destructor required
    virtual void DoSomething() //implementing DoSomething in base class
    {
        std::cout << "Base";
    }
};

class Derived : public Base
{
public:
    void DoSomething() override //override DoSomething() in base class
    {
         std::cout<<"Derived";
    }
};
Base * pBase = new Derived();
//Base will choose the most suited DoSomething(), depending where it's pointing to
pBase->DoSomething(); 
pBase->a = 5;
pBase->b = 0.2f; 

输出。

Derived

编辑。

正如你在评论部分所建议的那样,在这种特定情况下,派生类的铸造会起作用,但它通常会显示出设计不良的代码,正如你所指出的那样。@用户4581301的评论又注意到 提供链接 有一些原因,为什么这不是最好的主意。

正如我所说的,如果你一定要这样做,请使用...。dynamic_cast<>() 来代替。

请注意,在任何情况下,你仍然需要虚拟的反构件来正确实现多态性。

虚拟析构器

通过指向base的指针来删除一个对象会调用未定义的行为,除非基类中的destructor是虚拟的。

这还不是全部,请检查 这个环节.

© www.soinside.com 2019 - 2024. All rights reserved.