首页 > 试题广场 >

下面 C++ 代码的运行结果为() #includeios

[单选题]
下面 C++ 代码的运行结果为()
#include<iostream>
using namespace std;

class Base {
public:
    Base(int value) : m_value(value) {}
    virtual void add(int value) {
        m_value += value;
    }
    virtual void print() {
        cout << "Base: " << m_value << endl;
    }
private:
    int m_value;
};

class Drive :public Base {
public:
    Drive(int value) : m_value(value) {}
    virtual void print() {
        std::cout << "Drive: " << m_value << std::endl;
    }
private:
    int m_value;
};

int main()
{
    Drive d(1);
    d.add(2);
    d.print();
    return 0;
}
  • 输出:"Base: 3"
  • 输出:"Drive: 3"
  • 编译报错,Drive 的构造函数列表初始化没有显示调用 Base 的构造函数
  • 编译报错,Base 已经有了m_value 成员变量,Drive 再声明一个会导致重定义
答案选C。 1. 分析选项C:在C++中,当派生类构造函数进行初始化时,如果没有显式调用基类的构造函数,编译器不会自动调用基类的构造函数。在 Drive 类的构造函数 Drive(int value) : m_value(value) {} 中,没有显式调用 Base 类的构造函数,这会导致编译报错,所以选项C正确。 2. 分析选项D:在C++中,派生类可以定义与基类同名的成员变量,这不会导致重定义错误。这种情况下,派生类的成员变量会隐藏基类的同名成员变量,访问时需要通过作用域运算符来区分,所以选项D错误。 3. 假设代码修正后的运行分析:如果在 Drive 类的构造函数中显式调用 Base 类的构造函数,如 Drive(int value) : Base(value), m_value(value) {}  。此时 add 函数是在 Base 类中定义的,它操作的是 Base 类中的 m_value  。 print 函数在 Drive 类中被重写,由于对象是 Drive 类的,会调用 Drive 类的 print 函数。但 Drive 类的 print 函数输出的 m_value 是 Drive 类自己的成员变量,其值在构造函数中被初始化为1,没有被 add 函数修改,所以输出不是“Drive: 3”,选项B错误;同理也不会输出“Base: 3”,选项A错误。
发表于 2025-03-10 13:12:00 回复(0)
这部分内容主要涉及c++的继承 虚函数机制。

在默认的情况,基类和派生类可以具有重名的成员变量和成员方法。
前者是两个独立的变量,需要分别进行初始化处理。方法可以通过重写来实现不同的处理。

第29行声明的Drive类型 变量d会同时具有基类Base和派生类Drive的m_value成员变量。

Drive类的m_value通过它的构造函数进行初始化,可以正常。
而Base附带的m_value也需要初始化,但是Base类当中并没有无参的默认初始化构造函数,而是一个需要参数的构造函数。
 Base(int value) : m_value(value) {}


在我们声明派生类的时候,如果基类的成员变量需要初始化,如果我们没有显式调用基类的初始化构造函数,
Drive(int value) : m_value(value) {}

则会调用基类的默认初始化构造函数(也就是无参那种) 对Base的成员变量进行初始化,

但是在这个例子当中Base的构造函数是有参的,所以是没法按照默认的初试化。
应该写成这样,手动调用基类的构造函数。
Drive(int value) : m_value(value), Base(value) {} ;

才能正常运行。
(后面是我修改后代码的运行逻辑)

这样的话,基类的value初试化为1, Drive的初试化为1.
add方法调用时,因为是基类方法,所以访问基类变量,value变成3.
print的时候,根据实际的变量类型调用print,
是drive类型则调用drive的print,输出drive的value为1.






发表于 2025-02-26 14:48:41 回复(0)