在类实例化期间未设置继承值

not set inherited value during class instantiation

本文关键字:设置 继承 实例化      更新时间:2023-10-16

所有对象都有父类

#pragma once
#include <string>
/*
    Main parent class.
*/
class Object
{
protected:
    std::string className;
public:
    std::string getClassName() {
        return className;
    }
};

我继承了class

#pragma once
#include "object.cpp"
#include <iostream>
class Skill : public Object
{
private:
    Skill() {
        className = "skill";
    }
    std::string skillName;
public:
    Skill(std::string skillName) {
        this->skillName = skillName;
    }
    void useSkill() {
        std::cout<<"Skill is used";
    }
};

但是当我尝试在函数main中获得className时-它显示空行。

int main()
{
    Skill *s = new Skill("Unique skill!");
    std::cout << "Attempt to retrieve skill " << s->getClassName(); // show only message Attempt to retrieve skill
}

出什么事了?

问题是调用单参数构造函数不会调用零参数构造函数,所以className永远不会被设置。

如果你使用的是c++ 11,你可以委托给你的默认构造函数来避免代码重复:

Skill(std::string skillName) : Skill(){
    this->skillName = skillName;
}

或者,您可以使用带有默认实参的单个构造函数:

Skill(std::string skillName = "") : skillName(skillName){
    className = "skill"; //better to write an Object constructor to handle this
}

这是因为您从main调用的单参数构造函数使className变量为空。将构造函数定义更改为

Skill(std::string skillName) {
    className = "skill";
    this->skillName = skillName;
}

或从this调用其他构造函数(仅在C++11中有效)。

更好的方法是使用初始化列表

Skill(std::string skillName) : skillName(skillName) {
    className = "skill";
}