假设我已经实现了以下类
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 可以吗?如果是这样,这是最佳做法吗?
对于 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!
我是一名优秀的程序员,十分优秀!