草庐IT

Inheritance

全部标签

c++ - 从基类解析 C++ 虚函数

抱歉,如果这是一个骗局,我找不到非常正确的答案。我想从基类成员调用函数,并将其解析为子类版本。我以为将其声明为virtual就可以了,但事实并非如此。这是我的方法:classGUIWindow{public:GUIWindow(){SetupCallbacks();}virtualvoidSetupCallbacks(){//Thisfunctionalwayscalled}};classGUIListbox:publicGUIWindow{public:voidSetupCallbacks(){//Thisnevercalled}};GUIListboxlb;//GUIWindow:

c++ - 为什么所有现有的 C++ 编译器都不支持继承构造函数?

目前,G++和VC++2010都不支持继承构造函数。但是,我认为这是C++0x中最漂亮的功能之一。而且我认为它应该很容易由编译器实现。为什么编译器对这个特性不感兴趣?假设我想像这样通过继承std::string来设计我自己的字符串类:classMyString:publicstd::string{public://Ihavetoredefinemanyoverloadedctorshereandforwardtheirargumentsto//std::string'sctors.Howtediousitwillbe!!!};一个漂亮的代码示例:structB1{B1(char);};

c++ - 派生和破坏封装,还是违反 DRY?

我有两个C++类:Sequence,就像std::vector和File,它是一个表示机器上文件的字符串序列。从Sequence派生File是很容易的事。它的行为完全相同,但增加了读写文件的功能。File特定的功能很容易实现,无需将Sequence的数据成员标记为protected。相反,它们可以是私有(private)的,File可以使用Sequence的公共(public)接口(interface)。到处都是快乐的时光。我想创建一个Array类,在内部管理动态分配的内存。Array对象不能调整大小;大小在构造函数中指定。*这就是事情变得有争议的地方。从概念上讲,从Array派生Se

c++继承 - 具有不同参数类型的相同方法名称

我正在尝试在VC++2010中编译以下代码:classBase{public:std::wstringGetString(unsignedid)const{returnL"base";}};classDerived:publicBase{public:std::wstringGetString(conststd::wstring&id)const{returnL"derived";}};intwmain(intargc,wchar_t*argv[]){Derivedd;d.GetString(1);}我的理解是Derived有两种方法:std::wstringGetString(uns

C++ 非多态接口(interface)

简单地说,您如何在C++中为单级继承创建接口(interface)(出于简单性和教学原因)?我看到一些代码没有使用多态性,但是基类包含一个虚拟抽象方法(virtualvoidTheMethod()=0)。现在用纯虚方法从这个抽象类派生出一个类,但是在后面的代码中,使用派生类的实例完全没有动态分配。这是正确的做法吗?使用多态设计推断出的开销又如何呢?我认为这是不可能的。这看起来更像是隐藏/重影基本方法,即使该方法是纯虚拟方法也是如此。稍后编辑:感谢所有设法提供一些好的答案的人,我想强调一个严重的错误,该错误是由于使用“动态分配”而引起的,其含义是强调这一点对象创建的可能性是唯一与多态性兼

c++ - emplace_back 和继承

我想知道是否可以使用emplace_back将项目存储到vector中,emplace_back是一种派生自vector所期望的类的类型。例如:structfruit{std::stringname;std::stringcolor;};structapple:fruit{apple():fruit("Apple","Red"){}};其他地方:std::vectorfruits;我想在vector中存储一个apple类型的对象。这可能吗? 最佳答案 没有。vector仅存储固定类型的元素。你想要一个指向对象的指针:#include

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

java - 访问派生类对象的字段,C++ vs Java

如果在将此对象分配给java中的基类类型的变量后访问派生类对象的字段,我会得到预期的行为,这意味着打印字段的派生类的值。在c++中打印属于基类的字段值。在Java中,6按预期打印:classIdeone{staticclassA{staticinta=7;}staticclassBextendsA{staticintb=6;}publicstaticvoidmain(String[]args)throwsjava.lang.Exception{Aa=newB();System.out.println(((B)a).b);}}在C++中,打印7:#includeusingnamespac

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++ - 函数声明中缺少 'virtual' 限定符

在浏览一些旧代码时,我遇到了类似于以下内容的内容:classBase{public:virtualintFunc();...};classDerived:publicBase{public:intFunc();//Missing'virtual'qualifier...};代码编译良好(MSVS2008),没有警告(级别4)并且按预期工作-Func是虚拟的,即使派生类中缺少虚拟限定符。现在,除了引起一些困惑之外,这段代码是否有任何危险,或者我是否应该全部更改它,添加virtual限定符? 最佳答案 virtual将被传递到派生类中的