被要求描述虚函数是什么似乎是评估基本C++知识的面试中最常见的问题之一。然而,经过几年的C++编程,我仍然有一种不舒服的感觉,即我并不真正理解如何最好地定义它们是什么。如果我查阅维基百科,我看到虚函数的定义是:"Inobject-orientedprogramming,avirtualfunctionorvirtualmethodisafunctionormethodwhosebehaviourcanbeoverriddenwithinaninheritingclassbyafunctionwiththesamesignature"这个定义看起来简单而优雅,而不是特定于C++的。但对我
我有一个多态类的层次结构,比如Shape抽象基类及其派生类,例如Rectangle、Circle等。在VirtualConstructorIdiom之后,我想知道为什么在使用智能指针时,派生类中的虚构造函数的返回类型应该返回与其父类相同的类型?例如,看下面的代码,其中clone()和create()成员函数需要返回smart_pointers到Shape类。但是,当使用简单指针时,返回类型可以与派生类的类型相同。谁能解释为什么我们需要以引用的方式处理这些功能?classShape;typedefstd::unique_ptrshape_ptr;classShape{public://t
我试图回答提到的问题here通过传递对指针的引用而不是像这样指向指针的指针:classParent{};classChild:publicParent{};voidRemoveObj(Parent*&pObj){deletepObj;pObj=NULL;}intmain(){Parent*pPObj=newParent;Child*pCObj=newChild;pPObj=newParent();pCObj=newChild();RemoveObj(pPObj);RemoveObj(pCObj);//Thisisline32return1;}但这会在第32行产生以下编译器错误:erro
我问了一个question早些时候,但事实证明我的问题没有通过我的示例正确建模。所以这是我的实际问题:我有A类和继承自A的B类,我有两个函数foo(A&)和foo(B&),我有一个A*指针列表,其中包含A和B的实例。如何为A的实例调用foo(A&)并为B的实例调用foo(B&)?约束:我可以修改A和B的实现,但不能修改foo的实现。看下面的例子:#include#includeclassA{public:};classB:publicA{public:};voidbar(A&a){std::coutl;l.push_back(newB());l.push_back(newB());fo
为什么都是析构函数,~D(),~C(),~B(),~A()在下面的例子中被调用了吗?只有一个虚析构函数:A。代码如下:#includeusingnamespacestd;classA{public:virtual~A(){cout 最佳答案 一旦A的析构函数被声明为virtual,所有派生类的析构函数也是virtual,即使它们没有被显式声明如此声明..所以你看到的行为正是预期的 关于c++-为什么当派生类的析构函数是非虚函数时基类析构函数调用派生对象?,我们在StackOverflow
C++不允许基于方法返回类型的多态性。但是,当重载隐式转换成员函数时,这似乎是可能的。有人知道为什么吗?我认为运算符在内部就像方法一样被处理。编辑:这是一个例子:structfunc{operatorstring(){return"1";}operatorint(){return2;}};intmain(){intx=func();//callsintversionstringy=func();//callsstringversiondoubled=func();//callsintversioncout 最佳答案 转换运算符实际上
我正在使用C++11智能指针重写一个应用程序。我有一个基类:classA{};派生类:classB:publicA{public:intb;};我有另一个包含带有A或B对象的vector的类:classC{public:vector>v;};我用A(基类)对象构造C没问题,但我如何用B(派生类)对象填充它?我正在尝试这个:for(inti=0;i());v.back()->b=1;};编译器返回:错误:“A类”没有名为“b”的成员 最佳答案 ButhowcanIfillitwithB(derivedclass)objects?您正在
我有两个类,有两个全局friendoparatorclassA{friendstd::ostream&operator如果我这样使用它,一切正常,B运算符(operator)的版本被调用:Bb;std::cout但是如果我使用多态性,A版本被调用,尽管动态类型是B:A*b=newB();std::cout一种解决方案是类型转换:std::cout(*b);但是有没有更简单或更优雅的解决方案呢? 最佳答案 是的。类中的一个输出运算符和虚拟打印函数。classA{public:virtual~A(){}private:virtualvo
好的,上下文是一些序列化/反序列化代码,它将字节流解析为更易于使用的“对象”表示(反之亦然)。这是一个带有基本消息类的简化示例,然后根据“类型”header,存在更多数据/函数,我们必须选择正确的子类来实例化:classBaseMessage{public:enumType{MyMessageA=0x5a,MyMessageB=0xa5,};BaseMessage(Typetype):mType(type){}virtual~BaseMessage(){}Typetype()const{returnmType;}protected:TypemType;virtualvoidparse(
scoped_ptr、shared_ptr等boost::smart_ptr可以用在std::map等std容器中吗?classSomeClass{std::map>a_map;};作为boost::smart_ptrcanbeusedforpolymorphism,在这种情况下也是如此吗?容器的销毁会触发子类的正确销毁吗? 最佳答案 scoped_ptr不能在标准容器中使用,因为它不能被复制(这是容器接口(interface)所要求的)。但是,可以使用shared_ptr。如果您不能使用C++11而您已经在使用boost,请考虑p