我有一个叫做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++初学者。
是的,你可以使用一个 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是虚拟的。
这还不是全部,请检查 这个环节.