C++ 扩展类中的可选virutal函数,在运行时测试它是否存在 A类{ 公众: 无效(*_start)()=0; void start(){ cout
有点傻 我可以简单地将可选函数定义为C++ 扩展类中的可选virutal函数,在运行时测试它是否存在 A类{ 公众: 无效(*_start)()=0; void start(){ cout,c++,oop,C++,Oop,有点傻 我可以简单地将可选函数定义为virtualvoid\u start(){};,而不是virtualvoid\u start()=0;。具有与上面所需代码完全相同的行为 导致: A类{ 公众: 虚空_start(){}; void start(){ cout有点傻 我可以简单地将可选函数定义为virtualvoid\u start(){};,而不是virtualvoid\u start()=0;。具有与上面所需代码完全相同的行为 导致: A类{ 公众: 虚空_start(){}; void
virtualvoid\u start(){};
,而不是virtualvoid\u start()=0;
。具有与上面所需代码完全相同的行为
导致:
A类{
公众:
虚空_start(){};
void start(){
cout有点傻
我可以简单地将可选函数定义为virtualvoid\u start(){};
,而不是virtualvoid\u start()=0;
。具有与上面所需代码完全相同的行为
导致:
A类{
公众:
虚空_start(){};
void start(){
如果没有类A,类B和类C是不存在的,类A分别是B和C的一部分。考虑到这一点,类A不必担心它是否被其他类继承
考虑到这一点,您可以简化代码。下面您可以找到一个代码可能为的示例:
struct A {
void start() {
cout << "Le ";
}
};
struct B : public A {
void start() {
A::start();
cout << "Blop\n";
}
};
struct C : public A {
void start() {
A::start();
}
};
int main () {
B b;
C c;
b.start();
c.start();
return 0;
}
结构A{
void start(){
如果没有类A,类B和类C是不存在的,类A分别是B和C的一部分。考虑到这一点,类A不必担心它是否被其他类继承
考虑到这一点,您可以简化代码。下面您可以找到一个代码可能为的示例:
struct A {
void start() {
cout << "Le ";
}
};
struct B : public A {
void start() {
A::start();
cout << "Blop\n";
}
};
struct C : public A {
void start() {
A::start();
}
};
int main () {
B b;
C c;
b.start();
c.start();
return 0;
}
结构A{
void start(){
如果没有虚拟方法,您可以执行以下操作:
class B : public A {
public:
B() {
_start = [](){ std::cout<<"Blop\n";};
}
};
B类:公共A类{
公众:
B(){
_start=[](){std::cout如果没有虚拟方法,您可以执行以下操作:
class B : public A {
public:
B() {
_start = [](){ std::cout<<"Blop\n";};
}
};
B类:公共A类{
公众:
B(){
_start=[](){std::coutvirtual方法根据定义是可选的,所以如果您真的想使用基类,它们在基类中的空实现与此等效。您想静态或多态地访问它吗?如果解决方案有点“冗长”,第一个方法可以是带有CRTP的dome我建议不要在变量、对象等的名称前使用下划线“389;”,因为它通常由C++的内部对象使用。根据定义,虚拟方法是可选的,所以如果您确实想使用基类,它们在基类中的空实现与此等效。您想静态地还是多态地访问它?第一个可以是如果解决方案有点“冗长”,则使用CRTP圆顶我建议不要在变量名、对象名等之前使用下划线“uu”,因为它通常由C++的内部对象使用。好吧,如果这是您想要它的行为,是的。还有更深奥的用例:P仍然可以将该方法设置为某个空值,并且可以选择测试该方法是否在运行时定义。好吧,如果这就是你想要它的行为,是的。还有更深奥的用例:P仍然可以将方法设置为一些空值,并且可以选择测试方法是否在运行时定义。