我有以下
class base
{
};
class derived : public base
{
public:
derived() {}
void myFunc() { cout << "My derived function" << std::endl; }
};
现在我有
base* pbase = new dervied();
pbase->myFunc();
我正在收到错误myFunc不是基础的memember函数。
如何避免这种情况?以及如何调用myFunc?
注意我应该让基类不包含任何函数,因为它是设计的一部分而且上面的代码是大函数的一部分
答案 0 :(得分:4)
如果您坚持认为此功能不应该是基础的一部分,那么您只有2个选项可以执行此操作。
使用指向派生类的指针
derived* pDerived = new dervied();
pDerived->myFunc();
或(丑陋&amp; 强烈气馁)static_cast指向派生类类型的指针然后调用函数
注意:谨慎使用 。仅在您确定要投射的指针类型时使用,即您确定pbase
是derived
或从derived
派生的类型。在这种特殊情况下它可以,但我猜这只是实际代码的一个例子。
base* pbase = new dervied();
static_cast<derived*>(pbase)->myFunc();
答案 1 :(得分:3)
myfunc
需要可以从基类访问,因此您必须在myfunc
中声明公共虚拟base
。如果您希望base
成为一个抽象基类,即无法实例化并充当接口的基类,则可以使其成为纯虚拟基类:
class base
{
public:
virtual void myfunc() = 0; // pure virtual method
};
如果你能够实例化base
个对象,那么你必须为myfunc
提供一个实现:
class base
{
public:
virtual void myfunc() {}; // virtual method with empty implementation
};
如果要从指向基类的指针访问函数,没有其他干净的方法可以执行此操作。最安全的选择是使用dynamic_cast
base* pbase = new derived;
....
derived* pderived = dynamic_cast<derived*>(pbase);
if (derived) {
// do something
} else {
// error
}
答案 2 :(得分:2)
要使用基类指针,必须将基类定义更改为:
class base
{
public:
virtual void myFunc() { }
};
我看不出别的办法了。遗憾。
答案 3 :(得分:0)
您可以将其添加为base的成员,并使其成为虚拟或纯虚函数。但是,如果使用此路由,则还应在基类中添加虚拟析构函数,以便成功销毁继承的对象。
class base
{
public:
virtual ~base(){};
virtual void myFunc() = 0;
};
class derived : public base
{
public:
derived() {}
void myFunc() { cout << "My derived function" << std::endl; }
};