C++ 使用静态函数在C+中创建抽象基类+;
有一个用例,其中C++ 使用静态函数在C+中创建抽象基类+;,c++,static,virtual,abstract-class,C++,Static,Virtual,Abstract Class,有一个用例,其中 Class foo { public: static std::string make(std::string a) { .. } } 我想让foo成为一个抽象基类,但显然make不能在这个抽象基类中,因为虚拟函数不能是静态的 像这样 Class foo { public: static virtual std::string make (std::string) = 0; //error this cannot be done } Class foo
Class foo {
public:
static std::string make(std::string a) { .. }
}
我想让foo成为一个抽象基类,但显然make不能在这个抽象基类中,因为虚拟函数不能是静态的
像这样
Class foo {
public:
static virtual std::string make (std::string) = 0; //error this cannot be done
}
Class fooImpl: foo{
public:
std::string make(std::string a) { ..}
}
从设计角度来看,使抽象类中的方法非静态或使派生类具有静态方法是一种很好的方法。可以使析构函数成为纯虚拟函数: class foo { public: virtual ~foo() = 0; } 福班{ 公众: 虚拟~foo()=0; } 您只需确保为析构函数提供一个实现: foo::~foo() {} foo::~foo(){} 编辑:
因此,您可以从中派生一个类,但其本身不能实例化。您可以将析构函数设置为纯虚拟函数: class foo { public: virtual ~foo() = 0; } 福班{ 公众: 虚拟~foo()=0; } 您只需确保为析构函数提供一个实现: foo::~foo() {} foo::~foo(){} 编辑:
因此,您可以从中派生一个类,但它本身不能实例化。其他人提出的问题是,该方法应该是虚拟的还是静态的 多态性是基于这样一种想法,即无论对特定对象实例的引用类型如何,都要调用该实例的行为
base& somefunction(); // may return base or derived objects
base &b = somefunction();
b.method();
现在,如果方法行为从基变为派生,并且您想要引用的真实实例的行为,那么您需要多态性,从而需要虚拟方法。方法可以使用或不使用成员数据这一事实无关紧要,重要的是它是绑定到特定实例的行为
另一方面,静态方法绑定到类。也就是说,它是您正在处理的类的行为,而不是所引用实例的行为。因此,即使可以使用上面的语法,它也将调用类base中的静态方法,因为您正在处理的是类
没有理由在不深入了解领域的情况下确定您正在处理的任何设计选项都比其他设计选项更好。我希望上面的推理能帮助您做出决定。其他人提出的问题是,该方法应该是虚拟的还是静态的 多态性是基于这样一种想法,即无论对特定对象实例的引用类型如何,都要调用该实例的行为
base& somefunction(); // may return base or derived objects
base &b = somefunction();
b.method();
现在,如果方法行为从基变为派生,并且您想要引用的真实实例的行为,那么您需要多态性,从而需要虚拟方法。方法可以使用或不使用成员数据这一事实无关紧要,重要的是它是绑定到特定实例的行为
另一方面,静态方法绑定到类。也就是说,它是您正在处理的类的行为,而不是所引用实例的行为。因此,即使可以使用上面的语法,它也将调用类base中的静态方法,因为您正在处理的是类
没有理由在不深入了解领域的情况下确定您正在处理的任何设计选项都比其他设计选项更好。我希望上面的推理能帮助您做出决定。在非静态虚拟函数中封装静态函数可以在有实例时使用多态性,在没有实例时使用静态调用(我想不出任何用例,在没有实例时只需要多态性)。如果忘记将静态虚拟的实现放在派生类中,并且它不是很漂亮,但您不能做很多其他事情,那么就会出现编译时错误。遗憾的是,C0x标准中没有纠正这一疏忽,但这是一个相对狭窄的要求,因此我猜没有要求将静态函数包装在非静态虚拟函数中,当您有实例时允许多态性,当您没有实例时允许静态调用(我想不出有哪种用例只有在没有实例的情况下才需要多态性)。如果您忘记将静态虚拟的实现放在派生类中,则会出现编译时错误,这不是很漂亮,但您可以做的其他事情也不多。遗憾的是,C0x标准中没有纠正这一疏忽,但这是一个相对狭窄的要求,因此我想没有要求是的,但我不知道是什么问题是。听起来他好像在问如何创建一个抽象类。是的,但我不知道这个问题是什么。听起来他好像在问如何创建一个抽象类。