実際のコードを投稿できないため、これはトリッキーになりますが、次のようになります。
私は A->B->C の形式で継承を行っています。ここで、C は私が書いているクラスで、B から継承し、B は A から継承します。A と B はどちらも他の人によって書かれたものであり、変更することはできません (スタンドアロンで動作するようです)。テスト用のオブジェクトを作成するため、Ch を #include する TestC クラスもあります。C クラスは空です。TestC は C オブジェクトのみを作成します。Visual Studio 2013 で TestC プロジェクトをビルドすると、lnk2001 エラーが発生します。#include Ch をコメントアウトすると、これらはなくなります。C プロジェクトは問題なくコンパイルされます。
A.h
#pragma once
class A {
public:
A() {};
virtual ~A() {};
virtual int SomeGoodFunction() {return 0;};
virtual int BadFunction() {return 0;}; //lnk 2001: unresolved external
private:
virtual int SomeOtherFunction() {};
virtual int SomeOtherBadFunction() {}; //lnk 2001: unresolved external
};
B.h
#pragma once
namespace Model {
#include "A.h"
class B : public A {
public:
B() {}; //lnk 2019: unresolved external referenced in C()
virtual ~B() {}; //lnk 2019: unresolved external referenced in ~C()
private:
void Bad() {}; //lnk 2001: unresolved external
virtual ThisFunctionWorks() {};
void SoDoesThis() {};
};}
C.h
#pragma once
#include "B.h"
class C : public B {
friend class TestC;
public:
C() {};
~C() {};
int Initialize() {};
};
TestC.h
#pragma once
#include "C.h"
namespace Model {
class TestC {
int Test();
};
}
TestC.cpp
#pragma once
#include "TestC.h"
namespace Model {
int TestC::Test() {
C test = C(); //if I comment out, builds just fine
return 0;
}
}
(Ah & Bh には対応する .cpp が定義されていますが、内容は関連していないと思います;それが不平を言っているすべての関数は .cpp で定義されています ([ビュー定義] をクリックして VS構文エラーがあればご容赦ください; 私はこれを疑似コードとして書きましたが、構文をコンパイルした後にリンカー エラーが発生するので、元のコードには存在しないと確信しています。)
lnk2001 エラーは、Ah で仮想関数の定義が見つからず、Bh のコンストラクター、デコンストラクター、および 1 つの関数 (非仮想) が見つからないことを示しています。A & B の .h/.cpp ファイルを開くことができます。定義されていることについて不平を言っている関数を参照してください。TestC のインクルード ディレクトリには、これらが含まれています (#includes をクリックして開くことができるので、機能しています)。プロジェクトの依存関係は、ビルド順序に設定されています。プログラミングの観点からは、C は B から継承する必要はありませんが、上層部が決定を下したため、私自身はそれを変更できません。私が気付いていない継承や仮想関数のニュアンスに関係していると思います。
私は何が欠けていますか?ほとんどの Stack Overflow 記事を読んだような気がします...
編集: これらはそれぞれ独自のプロジェクトにあり、TestC を除くすべてが .lib であり、TestC は .exe です。この基本的なコードをすべて同じプロジェクトで使用すると、エラーなしでコンパイルされるので、C & TestC プロジェクト間の問題だと思います。