C++想要从基类调用派生函数

问题描述 投票:0回答:6

我有以下情况

class base
{
public:

   virtual void Accepted(SOCKET s)  //// Event
   {

   }
   void Listner()
   {
          SOCKET acpted;
          Accepted(acpted); /// When I call I want derived class's Accepted() to get called

   }

};


class derived
{
   virtual void Accepted(SOCKET s)  //// Event
   {
         ////// HERE i will write actual implementation (QUESTION)
   }

}

我想调用派生类的函数。这将像这里的事件一样工作。我想通知派生类基类中发生了一些事情。

c++ virtual
6个回答
7
投票

class derived : public base
将使
derived
实际上继承自
base
。然后你的虚拟函数调用将按预期工作。

请注意,您不能在

base
的构造函数或析构函数中进行此类虚函数调用 - 在调用
base
的构造函数时,
derived
部分尚不存在。在调用
base
析构函数时,
derived
部分已经被析构。

编辑:演示,回应评论。

class base
{
public:
    virtual void Accepted(SOCKET s)  //// Event
    {
        cout << "base::Accepted" << endl;
    }
    void Listner()
    {
        SOCKET acpted = 0;
        Accepted(acpted); /// When I call I want derived class's Accepted() to get called
    }
};


class derived : public base
{
    virtual void Accepted(SOCKET s)  //// Event
    {
        cout << "derived::Accepted" << endl;
    }
};


int main(int argc, char * argv[])
{
  derived d;
    d.Listner();
}

这将打印

derived::Accepted


2
投票

这可以按照您想要的方式工作。如果您的实际代码无法正常工作,那么您还没有向我们展示所有相关内容。

这是您如何做您想做的事情,也是您应该如何发帖的示例。

#include <iostream>
using namespace std;

class Base
{
public:
    virtual void Accepted()
    {
        cout << "Base::Accepted" << endl;
    }
    void Listener()
    {
        cout << "Base::Listener" << endl;
        Accepted();
    }
};

class Der : public Base
{
public:
    void Accepted()
    {
        cout << "Derived::Accepted" << endl;
    }
};

int main()
{
    cout << "*** BASE ***" << endl;
    Base b;
    b.Listener();

    cout << "\n*** DERIVED ***" << endl;
    Der d;
    d.Listener();
}

输出是:

*** BASE ***
Base::Listener
Base::Accepted

*** DERIVED ***
Base::Listener
Derived::Accepted

0
投票

除了使派生类扩展基类(派生:公共基类)之外,您还可以在基类中声明您接受的方法纯虚拟:

virtual void Accepted(SOCKET s) = 0;

这样派生类就被迫实现接受的方法。

而且派生类中的 Accepted 方法不需要是虚拟的。


0
投票

对您的代码进行以下更改。 1) 派生类:公共基类 2)创建派生类对象并调用Listener函数。 (如果您正在创建基类的对象,它将不起作用)

迪拉杰


0
投票

小心不要在构造或销毁期间调用虚拟函数。错误的实现定义的事情可能会发生:

构造函数中的 C++ 虚函数


-2
投票

谢谢朋友的解答。所有这些在技术上都是正确的。 我按照以下方式解决了它

我想通过不将任何方法设置为纯虚拟来允许创建基类的对象。

如果我将任何方法设为纯虚拟,那么它会使类基成为抽象的。

所以我创建了另一个抽象类,其中所有必需的方法都是纯虚拟的,并且我从中派生类基。这样我就可以创建基础对象。

例如

class __base__
{
public:
   virtual void Accepted(SOCKET s)  = 0 //// Event    
   {     
   }    

};

class base : public __base__
{ 
  public:     
       virtual void Accepted(SOCKET s)  //// Event    
        {     
}    
void Listner()    
{           
  SOCKET acpted;           
  Accepted(acpted); /// When I call I want derived class's Accepted() to get called     
}  
};

class derived : public base
{    
  virtual void Accepted(SOCKET s)  //// Event    
  {          
      ////// HERE i will write actual implementation (QUESTION)    
  }  
}
© www.soinside.com 2019 - 2024. All rights reserved.