草庐IT

C++从基类指针访问派生类成员

如果我分配一个Derived类的对象(具有Base的基类),并将指向该对象的指针存储在指向基类的变量中类,如何访问Derived类的成员?这是一个例子:classBase{public:intbase_int;};classDerived:publicBase{public:intderived_int;};Base*basepointer=newDerived();basepointer->//Accessderived_inthere,isitpossible?Ifso,thenhow? 最佳答案 不,您不能访问derived_

c++ - 虚函数默认参数

谁能解释c++编译器在哪里保留虚函数参数的默认值?我知道在子类中更改这些参数是个坏主意,但为什么呢?谢谢。 最佳答案 这是个坏主意,因为它们没有放在任何地方。使用的默认值将是那些在静态(编译时)类型中定义的值。因此,如果您要更改覆盖中的默认参数,但您通过基类指针或引用调用函数,则将使用基类中的默认值。#includestructBase{virtual~Base(){}virtualvoidfoo(inta=0){std::coutfoo();//prints"derived:0"deletederived;}

c++ - 虚函数默认参数

谁能解释c++编译器在哪里保留虚函数参数的默认值?我知道在子类中更改这些参数是个坏主意,但为什么呢?谢谢。 最佳答案 这是个坏主意,因为它们没有放在任何地方。使用的默认值将是那些在静态(编译时)类型中定义的值。因此,如果您要更改覆盖中的默认参数,但您通过基类指针或引用调用函数,则将使用基类中的默认值。#includestructBase{virtual~Base(){}virtualvoidfoo(inta=0){std::coutfoo();//prints"derived:0"deletederived;}

c++ - 为什么涉及虚拟继承时不能使用static_cast进行向下转换?

考虑以下代码:structBase{};structDerived:publicvirtualBase{};voidf(){Base*b=newDerived;Derived*d=static_cast(b);}这是标准禁止的([n3290:5.2.9/2])所以代码无法编译,因为Derived虚拟继承自Base。从继承中删除virtual使代码有效。此规则存在的技术原因是什么? 最佳答案 技术问题是无法解决Base*Base开头之间的偏移量是多少子对象和Derived的开始目的。在您的示例中,它看起来没问题,因为只看到一个带有Ba

c++ - 为什么涉及虚拟继承时不能使用static_cast进行向下转换?

考虑以下代码:structBase{};structDerived:publicvirtualBase{};voidf(){Base*b=newDerived;Derived*d=static_cast(b);}这是标准禁止的([n3290:5.2.9/2])所以代码无法编译,因为Derived虚拟继承自Base。从继承中删除virtual使代码有效。此规则存在的技术原因是什么? 最佳答案 技术问题是无法解决Base*Base开头之间的偏移量是多少子对象和Derived的开始目的。在您的示例中,它看起来没问题,因为只看到一个带有Ba

c++ - 将 shared_ptr<Base> 向下转换为 shared_ptr<Derived>?

更新:此示例中的shared_ptr与Boost中的类似,但它不支持shared_polymorphic_downcast(或dynamic_pointer_cast或static_pointer_cast)!p>我正在尝试在不丢失引用计数的情况下初始化指向派生类的共享指针:structBase{};structDerived:publicBase{};shared_ptrbase(newBase());shared_ptrderived;//error:invalidconversionfrom'Base*const'to'Derived*'derived=base;到目前为止,一切

c++ - 将 shared_ptr<Base> 向下转换为 shared_ptr<Derived>?

更新:此示例中的shared_ptr与Boost中的类似,但它不支持shared_polymorphic_downcast(或dynamic_pointer_cast或static_pointer_cast)!p>我正在尝试在不丢失引用计数的情况下初始化指向派生类的共享指针:structBase{};structDerived:publicBase{};shared_ptrbase(newBase());shared_ptrderived;//error:invalidconversionfrom'Base*const'to'Derived*'derived=base;到目前为止,一切

c++ - 为什么派生类中的重写函数会隐藏基类的其他重载?

考虑代码:#includeclassBase{public:virtualvoidgogo(inta){printf("Base::gogo(int)\n");};virtualvoidgogo(int*a){printf("Base::gogo(int*)\n");};};classDerived:publicBase{public:virtualvoidgogo(int*a){printf("Derived::gogo(int*)\n");};};intmain(){Derivedobj;obj.gogo(7);}遇到这个错误:>g++-pedantic-Ostest.cpp-ot

c++ - 为什么派生类中的重写函数会隐藏基类的其他重载?

考虑代码:#includeclassBase{public:virtualvoidgogo(inta){printf("Base::gogo(int)\n");};virtualvoidgogo(int*a){printf("Base::gogo(int*)\n");};};classDerived:publicBase{public:virtualvoidgogo(int*a){printf("Derived::gogo(int*)\n");};};intmain(){Derivedobj;obj.gogo(7);}遇到这个错误:>g++-pedantic-Ostest.cpp-ot

static_cast和dynamic_cast

C++的强制类型转换,除了继承自C语言的写法((目标类型)表达式)之外,还新增了4个关键字,分别是:static_cast、dynamic_cast、const_cast和reinterpret_cast。用法:xxx_cast(表达式)。由于后两者的使用频率较少,尤其是reinterpret_cast的风险性很高,所以就不展开讲了。这里主要将static_cast和dynamic_cast。static_cast解释所谓static_cast,顾名思义,就是静态的转换,是在编译期间就能确定的转换。主要用途用于基本数据类型之间的转换。#includeusingnamespacestd;intm