从派生类构造函数通过引用传递给基类构造函数

问题描述 投票:0回答:1

我想在派生类

Coord
的初始值设定项列表中包含类
Base
中结构体
Derived
的引用。当我将
Coord
的实例传递给
Derived
类构造函数时,会创建
Coord
的新实例 - 或者至少我认为这就是发生的情况,因为我无法从派生类更新我的
coord
对象.

我以这种方式传递引用是否违反了某种规则?还是只是做错了?

参见示例:

#include <iostream>

struct Coord{
  int x = 1;
  int y = 1;
  void printCoord(){
    std::cout << "X: " << x << " Y: " << y << std::endl;
  }
};

class Base{

  public:
  Coord myCoord;
  Base(Coord &coord): myCoord(coord){} // How do I modify this line so Base gets a copy of myCoord?
  virtual void updateCoord(int x, int y){};

};

class Derived : public Base {

  public:
  Derived(Coord &coord): Base(coord){} // Or possibly this line?
  virtual void updateCoord(int x, int y){ 
    myCoord.x = x;
    myCoord.y = y;  
    std::cout << "Updated to:" << std::endl;
    myCoord.printCoord();
  }
};

int main(){
  Coord myCoord;
  Base *baseptr;
  Derived d(myCoord);
  baseptr = &d;

  std::cout << "Before update:" << std::endl;
  myCoord.printCoord();
  baseptr->updateCoord(2,2);
  std::cout << "After update:" << std::endl;
  myCoord.printCoord();

  return 0;
}

我期望得到以下输出:

Before update:
X: 1 Y: 1
Updated to:
X: 2 Y: 2
After update:
X: 2 Y: 2

但是得到:

Before update:
X: 1 Y: 1
Updated to:
X: 2 Y: 2
After update:
X: 1 Y: 1
c++ pass-by-reference
1个回答
0
投票

将Base中

myCoord
的声明更改为引用:

class Base{

  public:
  Coord& myCoord;  // reference declaration
  Base(Coord &coord): myCoord(coord){} // How do I modify this line so Base gets a copy of myCoord?
  virtual void updateCoord(int x, int y){};

};

然后 myCoord 将与

main
中的 Coord 实例具有相同的引用。

© www.soinside.com 2019 - 2024. All rights reserved.