草庐IT

Inheritance

全部标签

c++ - 这个 C++ 模式的名称及其背后的原因是什么?

在我公司的C++代码库中,我看到很多这样定义的类://FooApi.hclassFooApi{public:virtualvoidsomeFunction()=0;virtualvoidsomeOtherFunction()=0;//etc.};//Foo.hclassFoo:publicFooApi{public:virtualvoidsomeFunction();virtualvoidsomeOtherFunction();};Foo是唯一继承自FooApi的类,接受或返回指向Foo对象的指针的函数使用FooApi*代替。它似乎主要用于单例类。这是编写C++代码的常见命名方式吗?这

c++ - 比 C++ 中的 dynamic_cast 更好的解决方案

我有一个为我的项目设计的类层次结构,但我不确定如何实现它的一部分。这是类层次结构:classShape{};classColored{//Onlypurevirtualfunctions};classSquare:publicShape{};classCircle:publicShape{};classColoredSquare:publicSquare,publicColored{};classColoredCircle:publicCircle,publicColored{};在我的部分项目中,我有一个不同类型形状的std::vector。不过,为了运行算法,我需要将它们放在彩色对

c++ - 这是非多态继承的一个很好的理由吗?

std::string(因为大多数——如果不是全部——标准类)没有任何虚拟方法,所以创建一个带有虚拟方法的继承类将导致UB(很可能是由于析构函数)。(如果我错了请纠正我)。我认为没有多态性的继承是可以的,直到我在网上看到这个主题。例如,在这个答案中:Whyshouldonenotderivefromc++stdstringclass?一些论点反对这种做法。主要原因似乎是切片问题,当将派生对象传递给函数而不是std::string时,它会抑制添加的功能。参数,从而使非多态性不合逻辑。如果想要扩展string的功能,惯用的C++方法是创建自由函数。.我同意所有这些,特别是因为我提倡自由函数

C++ 在基类中使用静态数组,在派生类中声明

我正在尝试创建一些类,它们都是从抽象类(我们称之为)BaseClass派生的类。在BaseClass中,我想对派生类中声明的static变量(数组)进行操作。C++中是否有一种聪明的方法让编译器知道静态变量将在派生类中声明?或者,例如,我应该在派生类的构造函数中将对静态变量的引用传递给基类构造吗?这是我的想法:classBaseClass{std::vector&vector;public:BaseClass(std::vector&dVector):vector(dVector){};voidvectorOperation(){vector.doSomething();}...}cl

c++ - 使用基类对象 C++ 初始化子类?

所以,标题可能有点困惑,但这是我的问题:我有一个父类(superclass)(我们称它为SupClass)和一个继承自SupClass的子类(我们称它为InhClass)。现在,我想为我的InhClass创建一个构造函数,它接收一个SupClass对象并用它初始化InhClass的“SupClass部分”。下面是一个代码示例,试图说明这一点:ClassSupClass{public:SupClass(){//InitializeSupClassobject}};ClassInhClass:privateSupClass{public:InhClass(SupClassobj){//In

c# - 为什么 SWIG C# 重载失败?

所以有一个simplecodeinC++.拥有一个C++库:classA{public:virtualvoidCall();virtualvoidCallCall();virtual~A();};还有一个swig文件:%{#include"A.h"%}%include"A.h"%module(directors="1")TestSWIG;%feature("director")A;调用SWIG生成器后,将生成的C++和C#文件包含到相关项目中并重建所有项目。swig.exe-c++-csharp-namespaceTestSWIG-outdir./Sharp/TestSWIG-o./T

c++ - 有没有办法指定或断言子类必须重新实现特定的非抽象虚方法?

这就是我的意思。我有一个类层次结构:classA{virtualintf()=0;};classB:publicA{intf()override{return5;}voiddoSpecificStuff(){}}B是一个自给自足的类,可以单独使用。但它也有很多后代:classC:publicB{intf()override{return171;}}有什么方法可以确保在子类化B时不会忘记重新实现f吗? 最佳答案 此解决方案的灵感来自@dyp的评论:你可以拆分B的两个职责,即“提供B风格的实现”和“可以被实例化”。classB_for_

c++ - 使用继承来添加功能

我正在使用抽象基类将日志记录功能添加到我的所有类中。它看起来像这样:classAbstractLog{public:virtual~AbstractLog()=0;protected:voidLogException(conststd::string&);private:SingletonLog*m_log;//definedelsewhere-isasingletonobject};LogException()方法将文本写入SingletonLog对象中定义的日志文件,然后抛出异常。然后我将其用作所有后续类的基类(在数百个库/DLL中可能有数百/数千个)。这允许我在通常会抛出异常的地

c++ - 继承构造函数仅部分起作用

我有下面的类(class),写成这样,无论typedef是什么,它都能完全工作:classA{protected:typedefucharmDataType;std::vectormData;uint32mWidth;uint32mHeight;friendclassC;public:A();A(void*data,uint32width,uint32height,size_tdataSize);A(constA&other);A(A&&other);A&operator=(constA&other);A&operator=(A&&other)=delete;~A();}我想创建一个子

c++ - C++11 中的可变参数模板和多重继承

我正在努力实现这样的目标:我有一个模板化的基类,我想动态继承它templateclassfooBase{public:fooBase(){};~fooBase(){};};期望的方法:(像这样,不太确定该怎么做)templateclassfoo:publicInterfaces...{public:foo();~foo();}我的目标是让foo类像这样:第二种方法:classfoo():publicfooBase,publicfooBase,publicfooBase//andthelistcouldgoon{foo();~foo();}使用第二种方法的问题是,如果我实例化一个foo对