Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何迭代某个派生类的基对象_C++ - Fatal编程技术网

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; 
      }
};
  • 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;
    }
    

    我想你的意思是

    #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
    具有type
    a*
    ,而
    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。另外,你必须有虚拟析构函数。