没有创建基类的对象时如何访问虚函数内容[关闭]

Posted

技术标签:

【中文标题】没有创建基类的对象时如何访问虚函数内容[关闭]【英文标题】:How to access vitual function's content when no object of the base class is made [closed] 【发布时间】:2013-12-22 19:39:31 【问题描述】:

我这里有一段代码实现了多态性。我想在不影响我之前的输出的情况下访问虚函数的内容。

谁能帮我解决这个问题?

class parent

      private:
              int m,n;
      public:
              parent(int x,int y): m(x),n(y)
              
                   cout<<"parent constructor called";
              
              virtual void display()
              
                   cout<<"\n"<<m<<"\t"<<n;
                   cout<<"\nParent display called";
                    
      ;

class child: public parent

      private: 
               int a,b;
      public:
             child(int x,int y, int c, int d): parent(x,y),a(c), b(d)
             
                    cout<<"\nchild constructor called";
             
             void display()
              
                   cout<<"\n"<<a<<"\t"<<b;
                    cout<<"\nChild display called";
                 
      ;      

int main()


    child c(4,5,6,7);
    parent *p=&c;
    p->display();
    getch();

【问题讨论】:

"访问虚函数的内容,不影响我之前的输出。" ?你的“以前的输出”是什么? “虚函数的内容”是什么意思? 不清楚你在问什么。你的程序做什么,你期望它做什么,它们有什么不同? 我的意思是父类的虚拟功能。我宝贵的输出是:父构造函数调用子构造函数调用6 7子显示调用 【参考方案1】:

我认为你的意思是以下

         void display()
          
               parent::display();
               cout<<"\n"<<a<<"\t"<<b;
                cout<<"\nChild display called";
             

【讨论】:

我想访问 virtual void display() cout 在这种情况下,每次调用 child 的 display() 时,也会调用 parent 的 display()。我想要独立调用uding的多态性概念 我不明白你想要什么。只需在子类中重新定义函数即可。【参考方案2】:

你可以直接从指向基类的指针来做

int main()

    child c(4,5,6,7);
    parent *p=&c;
    p->parent::display();
    p->display();
    getch();

【讨论】:

有没有不使用范围解析的访问方式?? 通过指针指向基类而不进行强制转换是我知道的唯一方法【参考方案3】:

作为附加说明。不要公开虚函数, 将它们设为私有并使用公共的非虚拟函数:

class parent 
public:
   void display() 
      cout<<"\n"<<m<<"\t"<<n;
      cout<<"\nParent display called";
      this->doDisplay();
   
private:
  virtual void doDisplay() 

;

class child : public parent 
private:
  void doDisplay() override 
     //No need to call parent::display anymore
    //...
  

;

这样就不会忘记拨打parent::display。将避免错误。

【讨论】:

以上是关于没有创建基类的对象时如何访问虚函数内容[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

探索c++虚函数表

虚基类 和 虚函数

C++ 设置基类的析构函数为虚函数

虚函数总结

6多态性-3虚函数

为啥“基类对象”不能调用它自己的虚函数? C++