gpt4 book ai didi

c++ - 对象数组和继承

转载 作者:行者123 更新时间:2023-11-30 04:10:17 24 4
gpt4 key购买 nike

我有 A 类作为基类,和 B 类,C 从 A 派生类并且有类 D 具有类型 A(组合)的数据成员(指向数组的指针)

enter code here

class D{
A **a;
int size;
.......
a = new A*[size];
......
};

并且我有 Print 方法,在它的主体中我必须使用给定 ID(B 和 C 都有数据成员 ID)的特定元素(如果它来自类 B 或 C)打印函数中应该有 2 个选项。 . B 类打印元素,还是C 类打印元素?我如何指定元素?

我做了 A 类抽象!!

enter code here
class A{
.......
virtual void print ()=0;
};

class B :public A{
........
........
void print(){
.......}
};

C 类:公共(public) A{ ………… ………… 无效打印(){ .......} };

class D{
........
.......
void Print ()
int P;
cout<<" if you want to print class B elements enter 1 , or 2 for class C"<<endl;
cin>>P;
if(P==1){
dynamic_cast<B*>(*a)->print(); }
else
if (P== 2){
dynamic_cast<C*>(*a)->print(); }

我的问题是,如果元素来自 B 类或 C 类,我如何指定元素???

最佳答案

我在这里假设了几件事,特别是 a成员实际上包含指向 A 的子类的指针-- 即 B s 和 C

我还假设在 print 中当您遍历此数组时,您不知道哪个是哪个。

如果您不关心哪个是哪个并且只想打印对象的属性,无论它们是什么类型,那么您可以提供一个纯 virtual A 中的方法返回 std::string (或其他东西)你想要 print() ,并在您的迭代中调用该方法:

class A
{
public:
virtual std::string printMe() const = 0;
};

class B : public A
{
public:
std::string printMe() const { return "I'm a B"; }
};

class C : public A
{
public:
std::string printMe() const { return "I'm a C"; }
};

如果您想打印任一类型的对象BC , 那么您需要能够使用 dynamic_cast 来确定哪个是哪个.自从使用 dynamic_cast这样only works对于多态类型,您需要确保 A至少有 1 virtual功能。不过这没关系,因为自 A在抽象层次结构中使用,你真的应该有一个 virtual无论如何都是析构函数,这就足够了。

class A
{
public:
virtual ~A() {};
};

现在您可以使用 dynamic_cast :

void A::print()
{
for (size_t i = 0; i < size; ++i)
{
A* theObj = a[i];
// assuming we only want to print B's...
B* theB = dynamic_cast <B*> (theObj);
if (theB)
{
theB->printObj();
}
}
}

关于c++ - 对象数组和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20705945/

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