我有以下情况
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)
}
}
我想调用派生类的函数。这将像这里的事件一样工作。我想通知派生类基类中发生了一些事情。
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
这可以按照您想要的方式工作。如果您的实际代码无法正常工作,那么您还没有向我们展示所有相关内容。
这是您如何做您想做的事情,也是您应该如何发帖的示例。
#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
除了使派生类扩展基类(派生:公共基类)之外,您还可以在基类中声明您接受的方法纯虚拟:
virtual void Accepted(SOCKET s) = 0;
这样派生类就被迫实现接受的方法。
而且派生类中的 Accepted 方法不需要是虚拟的。
对您的代码进行以下更改。 1) 派生类:公共基类 2)创建派生类对象并调用Listener函数。 (如果您正在创建基类的对象,它将不起作用)
迪拉杰
小心不要在构造或销毁期间调用虚拟函数。错误的实现定义的事情可能会发生:
谢谢朋友的解答。所有这些在技术上都是正确的。 我按照以下方式解决了它
我想通过不将任何方法设置为纯虚拟来允许创建基类的对象。
如果我将任何方法设为纯虚拟,那么它会使类基成为抽象的。
所以我创建了另一个抽象类,其中所有必需的方法都是纯虚拟的,并且我从中派生类基。这样我就可以创建基础对象。
例如
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)
}
}