如何解决值被添加到基类而不是派生类对象
我正在尝试方法覆盖,我没有弄明白我做错的地方。
下面是我试过的代码。
'#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
最后但并非最不重要的是,您的代码中没有覆盖。要使 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 举报,一经查实,本站将立刻删除。