首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 繼承錯誤:基類無默認構造函數導致派生類編譯失敗

     編輯:程式設計綜合問答

代碼中 Triangle 繼承自 Point,但 Point 僅提供帶參數的構造函數 Point(int, int),未提供默認構造函數。當 Triangle 的構造函數未顯式調用基類構造函數時,編譯器嘗試隱式調用 Point() 失敗,報錯 no matching function for call to 'Point::Point()'。

錯誤代碼片段

class Point {
public:
    Point(int xx, int yy) { x = xx; y = yy; }
private:
    int x, y;
};

class Triangle : public Point { // 繼承關係設計不當
public:
    Triangle(Point p1, Point p2, Point p3) : p1(p1), p2(p2), p3(p3) {} // 缺少基類初始化
private:
    Point p1, p2, p3;
};

修正方法

在 Triangle 構造函數初始化列表中顯式調用基類構造函數:

Triangle(Point p1, Point p2, Point p3) : Point(0, 0), p1(p1), p2(p2), p3(p3) {}

設計原則建議

「三角形繼承自點」違反里氏替換原則 (LSP)。三角形 不是 一種點,而是 由 三個點組成。正確設計應使用組合而非繼承:

class Triangle {
private:
    Point p1, p2, p3;
public:
    Triangle(Point p1, Point p2, Point p3) : p1(p1), p2(p2), p3(p3) {}
    // 計算面積、周長等方法
};

組合模式更符合現實語義,避免繼承帶來的耦合與初始化問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved