草庐IT

C++:虚拟继承

全部标签

C++ 继承具有不同默认参数值的函数

我想继承一个成员函数而不重新定义它,但给它不同的默认值。我该怎么办?classBase{public:voidfoo(intval){value=val;};protected:intvalue;};classDerived:publicBase{public:voidfoo(intval=10);};classDerived2:publicBase{public:voidfoo(intval=20);};voidmain(){Deriveda;a.foo();//setthevaluefieldofato10Derived2b;b.foo();//setthevaluefieldof

c++ - 本地抽象类的纯虚拟析构函数

考虑以下代码:structA{virtualvoidfoo(){}virtual~A()=0;};structB:publicA{virtualvoidfoo(){};};A::~A(){};intmain(){A*a=newB();a->foo();}它工作得很好。但现在考虑第二个代码,我们需要在一个函数内本地声明我们的类:voidfoo(){structA{virtualvoidfoo(){}virtual~A()=0;};structB:publicA{virtualvoidfoo(){};};A::~A(){};//errorC2352:'A::~A':illegalcallo

c++ - 函数成员中的 enable_if 用于 void 和继承

我试图理解为什么这段代码无法编译://test.hstructBase{virtual~Base{};virtualvoidexecute(){}virtualvoidexecute(int){}virtualvoidexecute(double){}}templatestructTest:Base{voidexecute(typenamestd::enable_if::value,void>::type){//DoA}voidexecute(typenamestd::enable_if::value,int>::typet){//DoB}};//main.cppTestt;我收到编译

c++ - ostream/ofstream 继承问题

我正在编写C++程序,我需要一些帮助来理解错误。默认情况下,我的程序会打印到终端(STDOUT)。但是,如果用户提供文件名,程序将打印到该文件。如果我正在写入终端,我将使用std::cout对象,而如果我正在写入一个文件,我将创建并使用std::ofstream对象。但是,我不想一直检查我是否应该写入终端或文件。由于std::cout和std::ofstream对象都继承自std::ostream类,我想我会创建一种接受std::ostream对象的print_output函数。在调用此函数之前,我会检查是否应该打印到文件中。如果是这样,我将创建std::ofstream对象并将其传递

c++ - 继承静态变量成员,但分别共享给每一种继承类

如果类继承了带有静态变量成员的基类,将是它们唯一的一个成员,与所有继承的类共享。我有几种继承类,每一种都有很多实例。我希望每个继承类都有一个单独的静态成员,并与其所有实例共享。如何实现?谢谢,抱歉我的英语不好。编辑:classa{staticintvar;};classb::a{};classc::a{};现在,我希望b的所有实例都具有相同的var,并且c的所有实例都具有相同的var,但是varb的>将不同于c的var。我再次对我的英语感到抱歉,如果你能纠正我,请纠正我。 最佳答案 您可以使用CRTP解决这个问题:structYou

c++ - 如果基类析构函数是虚拟的,是否需要派生类析构函数定义?

我正在尝试以下示例:classbase//baseclass{public:std::listvalues;base(){}voidinitialize(base*b){values.push_front(b);}virtual~base(){values.clear();coutinitialize(static_cast(d));/*fillinglist*/deleteb;return0;}Q.1)为什么派生类的析构函数没有被调用,因为在基类析构函数中我正在执行values.clear()?Q.2)如果基类析构函数是虚拟的,是否需要派生类析构函数定义?

c++ - 使用 SFINAE 检测同类继承

我正在尝试编写一个元函数来检查作为可变参数模板参数传递的所有类型是否不同。执行此操作的最高效方法似乎是从一组类继承并检测是否存在错误。问题是以下代码编译失败,而我希望SFINAE可以工作。编辑。问题不是“如何编写该元函数”,而是“我如何捕获双重继承错误并在它发生时输出false_type”。AFAIK,只有SFINAE才有可能。templatestructdummy{};//error:duplicatebasetype‘dummy’invalidtemplatestructfail:dummy,dummy{};templatetrue_typetest(faila=fail());f

c++ - 为什么 std::unary_function 不包含虚拟析构函数

我遇到了类模板std::unary_function和std::binary_function。templatestructunary_function{typedefArgargument_type;typedefResultresult_type;};templatestructbinary_function{typedefArg1first_argument_type;typedefArg2second_argument_type;typedefResultresult_type;};这两个都可以用作特定用途的基类。但是其中仍然没有虚拟析构函数。我猜的原因之一是这些并不意味着要进

c++ - 虚拟表是每个对象还是每个类?

这个问题在这里已经有了答案:NumberofVirtualtablesandVirtualPointersinaC++Program(6个答案)关闭7年前。谁能告诉我虚表和虚指针是按类还是按对象?如果它们是针对每个对象的,为什么它们不能在同一类的对象之间共享,而不是为每个对象维护一个拷贝?

c++ - 在继承 : Can I override base class data members?

假设我有如下两个类:ClassA{public:..private:intlength;}ClassB:publicClassA{public:..private:floatlength;}我想知道的是:是否允许覆盖基类数据成员?如果是,这是一种好的做法吗?如果不是,扩展类数据成员类型的最佳方法是什么?有一个类满足了我的需求,我想重用它。但是为了我的程序需要,它的数据成员应该是另一种类型。我有一些书,但它们都只涉及重写基类成员方法。 最佳答案 您可以使用模板化成员,即通用成员,而不是覆盖成员。您还可以声明一个类似union的VARI