草庐IT

c++ - 为什么当派生类调用基类的纯虚函数时 g++ 不报错?

我有一个带有纯虚函数f()的类Base。另一个类Derived派生自Base。我从Derived中调用f()。使用g++,我从链接器中得到一个错误。[agnel@dookutmp]$g++pure_virtual_function_call.cpp/tmp/ccGQLHi4.o:Infunction`Derived::f()':pure_virtual_function_call.cpp:(.text._ZN7Derived1fEv[_ZN7Derived1fEv]+0x14):undefinedreferenceto`VirtualBase::f()'collect2:error:l

c++ - 为什么派生类的大小包括来自基类的私有(private)成员?

我有以下代码:classA{private:inti;};classB:publicA{private:intj;};当我检查sizeof(B)时,它似乎是sizeof(base)+sizeof(derived)。但是,我对继承的理解是,基类的private成员不被继承。为什么它们包含在sizeof(B)的结果中? 最佳答案 所有成员变量都是继承的。privateprotectedpublic修饰符只会改变那些访问这些变量的人 关于c++-为什么派生类的大小包括来自基类的私有(priva

c++ - 我们在A(派生类) "is a"B(基类)时使用继承。当A "can be"B或C时我们怎么办?

抱歉提出这个丑陋的问题,但我不知道该如何表达。我将举例说明我的意思:人类可以是法师也可以是战士,所以法师和战士可以继承人类。但是,如果Orc也可以兼而有之呢?我们不能说“人是战士”或“战士是人”。Orc和Human(或者一个父类,Humanoid)是否继承了所有的技能,然后选择使用什么?我不知道是否应该标记特定语言,因为这是关于oop的一般性问题,但由于不同的语言对同一问题可能有不同的方法,所以我更喜欢从C++的角度来回答。 最佳答案 改进您的建模抽象类种族,具体类人类、兽人等...抽象类Class,具体类Mage、Warrior等

c++ - 为什么 std::shared_ptr 从基类和派生类调用析构函数,而 delete 只调用基类的析构函数?

这个问题在这里已经有了答案:Howisitpossible(ifitis)toimplementshared_ptrwithoutrequiringpolymorphicclassestohavevirtualdestructor?(3个答案)关闭8年前。为什么在使用std::shared_ptr释放时从基类和派生类调用析构函数,而第二个示例仅从基类调用析构函数?classBase{public:~Base(){std::coutsharedA(newDerived);}std::cout输出:--------------------DeriveddestructorBasedestr

c++ - 基类复制构造函数的可见性问题

我有一个类(暂时称它为base),它有一个protected接口(interface),包括protected构造函数等。base的一些功能|返回base的一个实例按值(value):classbase{protected:base(){}base(baseconst&other){}//line6basefoo(){baseret;returnret;}};这些函数被包装在派生类中以返回派生类型,如下所示:classderived:publicbase{private:derived(baseconst&b):base(b){}public:derived():base(){}der

c++ - 检测基类分配给指向派生类的引用

我目前正在研究多态类型和赋值操作之间的相互作用。我主要担心的是,是否有人可能会尝试将基类的值分配给派生类的对象,这会导致问题。来自thisanswer我了解到基类的赋值运算符总是被派生类的隐式定义的赋值运算符隐藏。所以对于简单变量的赋值,不正确的类型会导致编译器错误。但是,如果赋值是通过引用发生的,则情况并非如此:classA{public:inta;};classB:publicA{public:intb;};intmain(){Aa;a.a=1;Bb;b.a=2;b.b=3;//b=a;//good:won'tcompileA&c=b;c=a;//bad:inconcistenta

c++ - 防止两个类从具有相同模板参数的基类继承

我有一个假设是基类的类:templateclassBaseClass{...};如果两个类尝试使用相同的ID值从该基类继承,我该如何使编译时错误出现。也就是说-这段代码应该可以工作:classA:BaseClass{...}classB:BaseClass{...}但是这段代码可能会导致错误:classA:BaseClass{...}classB:BaseClass{...}如何才能做到这一点?BOOST_STATIC_ASSERT有帮助吗? 最佳答案 我认为这是不可能的。如果可能,那么我们也可以让编译器为以下代码生成错误,这在概念

c++ - 为什么不能存储基类的函数指针?

以下代码给出了voidb(){m=&A::a;的编译错误。};声明A::a()受到保护。(它是-但那应该没问题)然而,当我编写B::a()时,编译器并不关心。尽管两者的意思相同,但我更喜欢A::a(),因为它明确指出a()是在A中定义的。那么A::a()被禁止的原因是什么?编辑如果在B::b()中允许A::a(),也许有人可以找到一个有问题的示例。如果有这样的例子,我会标记为问题的答案。/编辑#include#include#include#includeclassA{protected:voida(){std::cout*m)();};protected:fm;};intmain()

c++ - 基类和派生类的复制构造函数

我有这两个类///////////BASECLASSclassBase{public:Base(int=0);~Base();Base(Base&);Base(Derived&);////我读到如果我的派生类没有复制c'tor将调用基的复制c'tor但每次我收到从Base到非标量的转换typeDerivedrequested谁错了?我的编译器或我的书,还是我误解了?提前致谢 最佳答案 只是一个提示。下面的代码是否给出同样的错误?classbase{};classderived:publicbase{};intmain(){deriv

c++ - 模板基类的子类的模板特化

这个问题有点难以解释,所以我先举个例子:我有一个类模板,它接受一个类型和一个整数常量作为模板参数,并且我有一些子类派生自该模板的实例化:templatestructBase{staticvoiddoSomething(){cout{};我想将这些类与一些其他模板(我们称之为测试)一起使用,这些模板具有针对不同类型的专门化。因为从Base的任何实例派生的所有类的行为应该完全相同,所以我只想定义一个Test特化来处理所有从Base派生的类。我知道我不能直接专门针对Base因为这不会检测到子类。相反,我的第一种方法是使用Boost的enable_if和类型特征://emptybodytotr