gpt4 book ai didi

C++更改子类中拥有的对象类型

转载 作者:太空狗 更新时间:2023-10-29 23:04:55 26 4
gpt4 key购买 nike

我们有四个类:A、B、X 和 Y。B 继承自 A,Y 继承自 X。A 的每个实例都创建一个 X 类型的拥有对象。一些伪代码:

class A {
protected:
X * OwnedObject;
}

class B : public A {
B();
void BFunction();
};

B::B() {
OwnedObject = new Y();
}

B::BFunction() {
OwnedObject -> YFunction(); //error, class A has no member named 'YFunction()'
}

class X {};

class Y : public X {
void YFunction(); //this function is new, it is not in X
};

当然,B 继承了指向 X 的指针。如果我们希望 B 创建(并且它的 OwnedObject 指针指向)子类 Y 而不是父类 X 的对象怎么办?解决此问题的最正确方法是什么?

编辑:抱歉,如果我不清楚,我添加了一些伪代码来更具体地说明我遇到的问题和我想做什么。感谢您到目前为止的投入!

最佳答案

我可以想到两种不同的方法。

在第一个中,我假设类 X 可以知道其子类可能更改/实现的功能,但它 (X) 本身并不知道确切的实现。在这种情况下,我在 X 中有一个 virtual 函数,并且根据是否有可能从 X 实例化,有两个实现:

// this X can not be instantiated
class X{
public:
virtual void f() = 0;
}
class Y : public X{
public:
virtual void f() { stuff to do; }
}

或者:

// this X can be instantiated
class X{
public:
virtual void f() { };
}
class Y : public X{
public:
virtual void f() { stuff to do; }
}

或者在另一种情况下,我假设因为 B 是从 Y 实例化的,所以它知道它是从 Y 实例化的,因此它可以安全地将它转换为 Y,只要它想使用它:

B::BFunction() {
static_cast<Y*>(OwnedObject) -> YFunction();
}

或者如果你想安全起见:

B::BFunction() {
if (dynamic_cast<Y*>(OwnedObject) != null)
static_cast<Y*>(OwnedObject) -> YFunction();
}

关于C++更改子类中拥有的对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21078373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com