C++ 如何迭代某个派生类的基对象
假设我已经实现了以下类C++ 如何迭代某个派生类的基对象,c++,C++,假设我已经实现了以下类 class A { public: virtual void printA() { cout << "Hi from A!" << endl; } }; class B : public A { public: virtual void printB() { cout << "Hi from B!" <<
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;
}
};
也许这些是愚蠢的问题,但是我对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;
}
我想你的意思是
#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;
}
1不起作用,因为
*x
具有类型A*
,而A
没有printC
成员。应该是:
if (C * c = dynamic_cast<C *>(*x)) {
c->printC();
}
if(C*C=dynamic_cast(*x)){
c->printC();
}
2可以,但与您的描述不匹配;您说您希望“只调用具有printC()
方法的对象”,而这将调用其他对象上的printA()
这看起来确实是一个奇怪的设计;您通常会定义一个虚拟函数,由每个类实现,以便为该类执行正确的操作,然后无条件地调用该函数。1将不起作用,因为
*x
具有typea*
,而a
没有printC
成员。应该是:
if (C * c = dynamic_cast<C *>(*x)) {
c->printC();
}
if(C*C=dynamic_cast(*x)){
c->printC();
}
2可以,但与您的描述不匹配;您说您希望“只调用具有printC()
方法的对象”,而这将调用其他对象上的printA()
这看起来确实是一个奇怪的设计;您通常会定义一个虚拟函数,由每个类实现,以便为该类执行正确的操作,然后无条件地调用该函数。什么是
i
,我看不到它已定义。这不会编译。因为printC()
不是a
的成员函数。请给出一个更好的示例。此外,您必须将print()
公开。此外,您必须具有虚拟析构函数。什么是i
,我看不到它已定义。这将无法编译。因为printC()
不是a
的成员函数。举一个更好的例子,你必须公开print()
public。另外,你必须有虚拟析构函数。