如何使用 C++ 中的继承函数访问派生类中的局部变量

Posted

技术标签:

【中文标题】如何使用 C++ 中的继承函数访问派生类中的局部变量【英文标题】:How do I access local variables in derived class with inherited functions in C++ 【发布时间】:2020-02-02 21:28:12 【问题描述】:

如何使用基类/继承类的成员函数访问派生类的局部变量?

我从 javascript 的角度出发,虽然我有一些 Java 经验,但已经有一段时间了。这是 JavaScript 中期望的结果。

// JavaScript Example

class State 
    constructor(name)
        this.name = name || "Parent";
    

    getName() return this.name ;


class StateReading extends State 
    constructor()
        super("Child");
    

    // Since StateReading extends State, it also inherits its parent's functions
    // in this case, it inherits getName()



const s = new StateReading();
console.log(s.getName());   // I print out "Child"

我正在尝试用 C++ 实现类似的东西,但我有很多时间让所有位 (har har) 排队。

#include <iostream>
using namespace std;


 class State 
    std::string name = "Parent";

    public: 
        virtual std::string getName()   // "virtual" keywords removes the compile time linkage
            return name;
        
 ;

 class StateReading : public State 
     std::string name = "Child";
 ;


int main() 

    StateReading sr = StateReading();
    State* s = &sr;  // Make state a pointer to a memory address so it can be reused

    cout<<s -> getName(); // Prints "Parent" ... but I'm pointing to StateReading's memory address ... :/
    cout<<sr.getName(); // At least this one should be child ... wait, it's "Parent" too?!
    return 0;

我可以让它工作的唯一方法是覆盖子类中的 getName() 。但我真的不想重写子类中的每一个方法。我正在尝试使用工厂模式来处理多态性的概念。我知道我总是会创建某种“状态”,但它可以是许多派生类中的任何一个。

// Untested example
class StateFactory

  public: 
    static make(params)
        switch(params) 
            case 0: return StateReading();
            case 1: return StatePaused();
            case 2: return StateWriting();
            default: // etc.
        
    



State state = StateFactory.make(params);
state.getName();  // prints out the state's name.  

对此有什么想法吗?似乎必须重写每个派生类以获取局部实例变量将是真正的维护噩梦。

【问题讨论】:

在 JS 中调用基类的构造函数。在 C++ 中做同样的事情 如果函数只有一个实现,你不必创建函数virtual。示例:godbolt.org/z/avdcME - 但将其设为 virtual 不会改变这样一个事实,即如果您正确实现构造函数,Child 在这两种情况下都会被打印出来。 【参考方案1】:

在 JS 中调用基类的构造函数。在 C++ 中做同样的事情

#include <iostream>
using namespace std;


 class State 
 public:
    State() = default;
    State(const std::string &n) : name(n) 
    virtual ~State() = default;

    std::string getName() 
        return name;
    
 private:
    std::string name = "Parent";
 ;

 class StateReading : public State 
 public:
     StateReading() : State("Child") 
 ;


int main() 

    StateReading sr = StateReading();
    State* s = &sr;  // Make state a pointer to a memory address so it can be reused

    cout<<s -> getName(); // Prints "Parent" ... but I'm pointing to StateReading's memory address ... :/
    cout<<sr.getName(); // At least this one should be child ... wait, it's "Parent" too?!
    return 0;

您不需要virtual 方法,因为您不会覆盖它,但您应该定义一个虚拟析构函数:When to use virtual destructors?

【讨论】:

【参考方案2】:

您可以在基类中保护“name”参数,然后在派生类的构造函数中更新其值。

或者,重写基类构造函数以接受字符串,然后通过派生类构造函数传递它。这样您就可以将变量“name”设为私有。

【讨论】:

欢迎来到 ***,如果需要理解答案,请添加更多描述和代码,因为它会尽快解决其他人的问题

以上是关于如何使用 C++ 中的继承函数访问派生类中的局部变量的主要内容,如果未能解决你的问题,请参考以下文章

C++笔记-类层次结构

C++继承(上)

c++解决二义性的方法

c++中的虚函数有啥作用?

c++中 static 变量和函数能否被子类继承

C++ | 类继承