#include<iostream> using namespace std; class MyClassB { public: virtual void m1() = 0; virtual void m2() = 0; }; class DerivedC :public MyClassB { public: virtual void m1() {} }; int main() { DerivedC d; d.m1(); return 0; }指出错误说明原因
时间: 2023-12-15 11:29:07 浏览: 65
在这个代码中,存在一个错误:在 `main` 函数中创建的 `DerivedC` 对象无法实例化,因为它是一个抽象类 `MyClassB` 的子类,而抽象类不能被实例化。抽象类是指含有纯虚函数的类,纯虚函数是指在类中没有实现的虚函数,需要子类进行实现。在这个例子中,`MyClassB` 中的两个函数 `m1()` 和 `m2()` 都是纯虚函数,因此 `MyClassB` 是一个抽象类。而 `DerivedC` 只实现了 `m1()` 函数,没有实现 `m2()` 函数,因此它仍然是一个抽象类。因此,无法创建 `DerivedC` 类的实例。要想创建 `DerivedC` 类的实例,需要在 `DerivedC` 中实现 `MyClassB` 中的所有纯虚函数。
相关问题
指出错误1分,说明原因2分 #include<iostream> using namespace std; class MyClassB {public: virtual void mi() = 0; virtual void m2() = 0; class Derived : public MyClassB {public: virtual void mi0 f int main() DerivedC d; d.m10); return
错误:代码中缺少了一对大括号,并且Derived类没有实现MyClassB中的纯虚函数。
原因:在代码中,MyClassB中的纯虚函数mi()和m2()没有被Derived类实现,导致Derived类也变成了抽象类,无法被实例化。此外,在Derived类的实现中,mi()函数的定义中缺少了一个左括号。最后,在main函数中,d对象调用的是m1函数,但实际上应该是mi函数。
有什么错误#include <iostream> using namespace std; int main() { B b; b.m1(); return 0; } class A { public: virtual void m1()=0; virtual void m2()=0; }; class B: public A { public: virtual void m1(){} };
这段代码中存在一个错误,因为在 main 函数中创建了一个 B 类的对象 b,但是 B 类继承了 A 类,而 A 类中的 m1() 和 m2() 函数都是纯虚函数,所以 B 类必须要实现这两个函数才能被实例化。但是在 B 类中只实现了 m1() 函数,没有实现 m2() 函数,所以编译器会报错。解决方案是在 B 类中实现 m2() 函数,或者将 A 类中的 m2() 函数改为非纯虚函数。另外,代码中应该在 A 类和 B 类定义之前声明类 A 的存在,否则编译器会报错。可以在代码开头添加如下声明语句:
```c++
class A; // 声明类 A 的存在
class B: public A {
public:
virtual void m1(){}
virtual void m2(){} // 实现 m2() 函数
};
class A {
public:
virtual void m1()=0;
virtual void m2()=0;
};
int main() {
B b;
b.m1();
b.m2(); // 调用实现的 m2() 函数
return 0;
}
```
阅读全文