在 C++ 中将派生类指针分配给基类指针
assigning derived class pointer to base class pointer in C++
我有以下
class base
{
};
class derived : public base
{
public:
derived() {}
void myFunc() { cout << "My derived function" << std::endl; }
};
现在我有
base* pbase = new derived();
pbase->myFunc();
我收到错误 myFunc 不是 base 的成员函数。
如何避免这种情况?以及如何让myFunc被调用?
注意我应该让基类不包含任何函数,因为它是设计的一部分,上面的代码是大函数的一部分
如果您坚持认为此功能不应该是 base 的一部分,那么您只有 2 个选项可以做到这一点。
使用指向派生类的指针
derived* pDerived = new derived();
pDerived->myFunc();
或者(丑陋和强烈不鼓励)将指针static_cast到派生类类型,然后调用函数
注意:请谨慎使用。仅当您确定要投射的指针的类型时才使用,即您确定pbase
是derived
或派生自derived
的类型。在这种特殊情况下还可以,但我猜这只是实际代码的一个例子。
base* pbase = new derived();
static_cast<derived*>(pbase)->myFunc();
myfunc
需要从基类访问,因此您必须在base
中声明一个公共虚拟myfunc
。如果你打算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
}
若要使用基类指针,必须将基类定义更改为:
class base
{
public:
virtual void myFunc() { }
};
我看不出其他办法。不好意思。
您可以将其添加为 base 的成员,并使其成为虚拟或纯虚拟函数。但是,如果使用此路由,则还应在基类中添加虚拟析构函数,以允许成功销毁继承的对象。
class base
{
public:
virtual ~base(){};
virtual void myFunc() = 0;
};
class derived : public base
{
public:
derived() {}
void myFunc() { cout << "My derived function" << std::endl; }
};
相关文章:
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- C++为 void 指针分配一个字符串
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- MPI 集合通信中的指针分配
- 函数指针分配在创建 DLL 后导致错误
- 通过双指针分配指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 为什么为char指针分配内存不会截断char序列
- C++指针分配字符数组的地址
- 将 void 指针分配给另一个 void 指针
- 如何将不同的成员函数指针分配给注册类的不同实例?
- 如何为指针分配特定的内存地址?
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 将指针分配给另一个指针时会发生什么情况?
- 为指向C++中的对象/对象的指针分配堆内存
- 将指针分配给字符串变量中包含的地址
- 当直接分配时,为什么此功能指针分配起作用,而不是与有条件的操作员一起使用