基本概念,派生类并正确使用它们

  • 本文关键字:派生 基本概念 c++ c++11
  • 更新时间 :
  • 英文 :


您必须使用基类的概念,派生类并正确使用它们。在做这件事的时候,我遇到了一些问题。你能帮我解决这些问题吗

我的代码:

#include <iostream>

class Base {
public:
Base (int data) : _data(data){}
virtual void printData(){
std::cout << "Base" << _data << std::endl;
}
private:
int _data;
};
class Derived : public Base {
public:
Derived(derivdata) : Base(derivdata){}
void printData(){
cout << "Derived " << _data << endl;
}
}

int main(){
Derived *var = new Derived(5);
var-> printData();
Base* basevar = static_cast<Base>(*var);
basevar-> printData();
}

Base* basevar = static_cast<Base>(*var);是错误的,
它应该是Base* basevar = static_cast<Base*>(var);
,但Base* basevar = var;是足够的。

和没有内存泄漏的版本:

int main(){
Derived derived(5);
derived.printData(); // "Derived 5n"
Base& base = *derived;
base.printData();    // "Derived 5n" as method is virtual
}

这里有几个问题,可能是打字错误:

  • Derived后面缺少分号
  • 在构造函数CCD_ 5中缺少CCD_。(c++中没有默认的int(
  • 缺少cout之前的命名空间std::Derived::printData中的endl
  • Derived::printData中,成员_data是不可访问的,因为它对Base是私有的(您可以使其受到保护或为其编写getter(

核心问题是这种强制转换:Base* basevar = static_cast<Base>(*var);这实际上会取消引用var的值,然后尝试将此值强制转换为Base,然后尝试向Base*类型的变量分配结果(类型为Base(。

对于多态投射,您可以使用dynamic_cast:Base* basevar = dynamic_cast<Base*>(var);

但是不要期望basevar->printData();打印"Base",因为指针仍然指向Derived的实例,并且该方法声明为virtual

要访问基类的方法,您需要显式地告诉编译器这样做:basevar->Base::printData();(打印"Base5"(

最新更新