gpt4 book ai didi

c++ - 如何遍历作为某个派生类的基对象

转载 作者:太空宇宙 更新时间:2023-11-04 16:14:41 24 4
gpt4 key购买 nike

假设我已经实现了以下类

class A
{
public:
virtual void printA()
{
cout << "Hi from A!" << endl;
}
};

class B : public A
{
public:
virtual void printB()
{
cout << "Hi from B!" << endl;
}
};

class C : public B
{
public:
void printC()
{
cout << "Hi from C!" << endl;
}
};

还可以说我创建了一个 std::vector<A *> vec它包含从 A、B 和 C 实例化的随机数量的对象。现在假设我被迫遍历 vec 中的所有对象。但只调用具有 printC() 的对象方法(即 C 实例)。执行此操作的最佳方法是什么?

int main()
{
std::vector<A *> vec;

....
// insert random objects from both A, B and C into vec
....

for(vector<A *>::iterator x = vec.begin();
x != vec.end();
x++)
{
if(dynamic_cast<C *>(*x) != 0) // 1. is this OK?
(*x)->printC();
else
(*x)->printA(); // 2. is this also OK?

}
}
  1. 1 可以吗?如果是这样,这是最佳做法吗?

  2. 对于 C 实例,2 也会导致问题吗?

也许这些都是愚蠢的问题,但我对 C++ 还很陌生,而且多态性在 C++ 中的工作原理对我来说非常陌生。谢谢

最佳答案

我认为你的意思如下

#include <iostream>
#include <vector>


int main()
{
class A
{
public:
virtual ~A() = default;
virtual void print() const
{
std::cout << "Hi from A!" << std::endl;
}
};

class B : public A
{
public:
void print() const
{
std::cout << "Hi from B!" << std::endl;
}
};

class C : public B
{
public:
void print() const
{
std::cout << "Hi from C!" << std::endl;
}
};

std::vector<A *> v = { new A(), new B(), new C() };

for ( A *p : v ) p->print();

return 0;
}

输出是

Hi from A!
Hi from B!
Hi from C!

关于c++ - 如何遍历作为某个派生类的基对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24080950/

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