微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

值被添加到基类而不是派生类对象

如何解决值被添加到基类而不是派生类对象

我正在尝试方法覆盖,我没有弄明白我做错的地方。
下面是我试过的代码
'#pragma 一次 #包括 使用命名空间标准;

            class Queue {
                int size;
                int* queue;
            
            public:
                Queue() {
                    size = 0;
                    queue = new int[100];
                }
                void add(int data) {
                    queue[size] = data;
                    size++;
                }
                void print() {
                    if (size == 0) {
                        cout << "Queue is empty" << endl;
                        return;
                    }
                    for (int i = 0; i < size; i++) {
                        cout << queue[i] << " <- ";
                    }
                    cout << endl;
                }
            };
            
            class Queue2 : public Queue
            {
                int size;
                int* queue;
            public:
                Queue2() {
                    size = 0;
                    queue = new int[100];
                }
                void print() {
                    if (size == 0)
                    {
                        cout << "Queue is empty" << endl;
                        return;
                    }
                    for (int i = 0; i < size; i++) {
                        cout << queue[i] << endl;
                    }
                    return;
                }
            };
            
            int main() {
                Queue q1;
                q1.add(42); q1.add(2); q1.add(8);  q1.add(1);
                q1.print();
            
                Queue2 q2;
                q2.add(3); q2.add(66); q2.add(128);  q2.add(5); q2.add(111); q2.add(77890);
                q2.print();
            
                return 0;
            }'

我的输出

42 <- 2 <- 8 <- 1 <-
Queue is empty

预期产出:

42 <- 2 <- 8 <- 1 <-
3
66
128
5
111
77890

解决方法

成员是继承的(无论是否私有)。不清楚为什么在派生类中重复成员,然后期望基类方法使用它们。

class Queue {
            int size;
            int* queue;

Queue 的方法正在使用这些成员。另一方面,

class Queue2 : public Queue {
            int size;
            int* queue;

派生类中的那些成员隐藏了基类中的成员。因此,在 main 中,当您使用 Queue2 时,您通过调用 queue 来填充基 Queue::queue 中的 Queue::add 成员,然后尝试打印 { {1}} 通过调用 Queue2::queue

您可以通过将基中的成员声明为 Queue::print 并在派生中删除它们来修复它:

protected

Live Example

最后但并非最不重要的是,您的代码中没有覆盖。要使 class Queue { protected: int size; int* queue; .... class Queue2 : public Queue { // int size; // remove them // int* queue; // Queue2 already has those members inherited from its base 覆盖 Queue2::print,该方法需要在基类中为 Queue::print。然后,您应该在派生类中将该方法声明为 virtual 以在没有覆盖时获得编译器错误:

override

为了说明派生对象具有两个成员,一个来自基类,一个来自派生类,即使这两个成员具有相同的名称,请考虑以下示例:

struct Queue {
    virtual void print() {}
};
            
struct Queue2 : Queue {
    void print() override {}
};

输出为:

#include <iostream>

struct base {
    int value = 42;
    void print(){
        std::cout << value << "\n";   // refers to base::value
                                      // inheritance will not change that
    }
};

struct derived : base {
    int value = 12;
    void set_value(int v){
        value = v;          // refers to derived::value
        base::value = 12;   // fully qualifying the name allows to 
                            // refer to base::value
    }
};
            
int main() {
    derived d;                
    d.set_value(10000);
    std::cout << d.value << "\n"; // refers to derived::value
    std::cout << d.base::value << "\n"; // refers to base::value
}

当您将成员设为私有时,它们仍然存在于派生类中,但是 name lookup 一旦找到 10000 12 就会停止,因此在派生类中 derived::value 指的是 {{ 1}}。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。