我有以下
class base
{
};
class derived : public base
{
public:
derived() {}
void myFunc() { cout << "My derived function" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)
我现在有
base* pbase = new derived();
pbase->myFunc();
Run Code Online (Sandbox Code Playgroud)
我收到错误 myFunc 不是 base 的成员函数。
如何避免这种情况?以及如何让 myFunc 被调用?
注意我应该让基类不包含任何功能,因为它是设计的一部分,上面的代码是大功能的一部分
myfunc需要可从基类访问,因此您必须myfunc在base. 如果您打算base成为抽象基类,即无法实例化并充当接口的基类,则可以将其设为纯虚拟:
class base
{
public:
virtual void myfunc() = 0; // pure virtual method
};
Run Code Online (Sandbox Code Playgroud)
如果您希望能够实例化base对象,那么您必须提供以下实现myfunc:
class base
{
public:
virtual void myfunc() {}; // virtual method with empty implementation
};
Run Code Online (Sandbox Code Playgroud)
如果您想从指向基类的指针访问函数,则没有其他干净的方法可以做到这一点。最安全的选择是使用dynamic_cast
base* pbase = new derived;
....
derived* pderived = dynamic_cast<derived*>(pbase);
if (derived) {
// do something
} else {
// error
}
Run Code Online (Sandbox Code Playgroud)
如果您坚持认为此功能不应该是 base 的一部分,那么您只有 2 个选项可以执行此操作。
要么使用指向派生类的指针
derived* pDerived = new derived();
pDerived->myFunc();
Run Code Online (Sandbox Code Playgroud)
或者(更丑陋且强烈不鼓励)将指针 static_cast 指向派生类类型,然后调用该函数
注意:要谨慎使用。仅当您确定要强制转换的指针的类型时才使用,即您确定它pbase是 aderived或派生自 的类型derived。在这种特殊情况下没问题,但我猜这只是实际代码的一个例子。
base* pbase = new derived();
static_cast<derived*>(pbase)->myFunc();
Run Code Online (Sandbox Code Playgroud)