假设我已经实施了以下课程
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 ++中是如何工作的对我来说非常奇怪。感谢
答案 0 :(得分:3)
我认为你的意思是以下
#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!
答案 1 :(得分:2)
1赢了,因为*x
的类型为A*
,而A
没有printC
成员。它应该是:
if (C * c = dynamic_cast<C *>(*x)) {
c->printC();
}
2很好,但与您的描述不符;你说你想要&#34;只调用具有printC()
方法&#34;的对象,而在其他对象上调用printA()
。
这确实看起来像一个奇怪的设计;你通常会定义一个虚拟函数,由每个类实现为该类做正确的事情,然后无条件地调用它。