gpt4 book ai didi

C++ 抽象类和多态性

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:23:01 25 4
gpt4 key购买 nike

[更新] 我正在努力使用抽象类,这是我的代码(简单模型):

class A{
public:
virtual ~A(void){};
virtual void print() const = 0;
};

class B : public A{
public:
void print() const{cout << x << endl;}
private:
int x;
};

class C : public A{
public:
void print() const{cout << x << endl;}
private:
double x;
};

class X{
public:
X(void){
array = new A * [20];
}
void Add(const A & src){
array[someindex] = &src; //Fpermissive, cannot convert const A * to A *
};
private:
A ** array;
};

int main(int argc, char const *argv[]){
X obj;
obj.Add(B(9)); //B.x = 9
obj.Add(C(3.3333)); // C.x = 3.3333

return 0;
}

如何将 B 和 C 存储在 X 的数组中?我怎样才能使 src 成为非常量?是否可以?感谢您的回复。而且我无法修改 main.我不想为 B 类或 C 类的参数创建方法 Add...

好的,目标是,我必须将对象 BC 存储在 X 中,而且我无法修改主要功能。 BC 的对象具有非常相似的方法。

最佳答案

如何将 B 和 C 存储在 X 中的数组中?

你不能。您只能存储指向它们的指针,并且只能在分配空间来存储它们之后。

我怎样才能使 src 成为非 const?

据推测,您“被迫”将 const 添加到 X::Add() 的参数声明中,因为您传递的是临时变量。您需要传入左值的地址。

void X::Add( A *src ) { array[someindex] = src; }

B b(9);
X.Add( &b );
C c(3.3333);
X.Add( &c );

这可能吗?

是的,使用 const_cast<> ,但在这种情况下,这将是灾难的根源。您的根本问题是您试图存储临时地址。当你做这样的事情时:

X.Add(B(9)); // B will be destroyed when the execution of this statement ends.

假设您找到了一种方法,您最终将存储在数组中的内容将是指向垃圾的指针。

更新:根据评论中的交流,您似乎需要保存 const A& src 的拷贝项目传递给 X::Add()方法。通过基类引用或指针进行复制需要一个虚拟的“clone()”方法,其特定目的是在运行时调用子类实现。

class A {
...
virtual A* clone() const = 0;
...
};

class B : public A {
...
// Note signature: this works due to return type covariance
B* clone() const { return new B(*this); }
...
};
// similarly for class C and others

// use it like this
class X {
...
void Add(const A & src){ array[someindex] = src.clone(); }
...
};

当然,完成后您必须注意释放这些对象。

关于C++ 抽象类和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23176089/

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