
No.5ベストアンサー
- 回答日時:
#3 の「余談その2」のように書いちゃうと, Base のコンストラクタが呼び出せないね. 失敗.
とすると
template <typename Base>
struct DEFINESUPERAs {
typedef Base SUPER;
};
class Derived : public Base, public DEFINESUPERAS<Base> {
// 略
};
のようにするしかないけど, こんなことするくらいならふつうに typedef するかてきとうなマクロ作るよなぁ.
発展させれば
3つ目の親クラスを SUPER<2> で指定する
ことができるとは思うけど, そこまでしたいかなぁ.
回答ありがとうございます
C++言語だとSUPERを使うようなのを考えると、結構めんどくさいことになりそうですね
typedefやusing?も検討しますが、
そもそも親クラスの関数を呼び出さなくて済む構造なども視野に入れてみます
No.4
- 回答日時:
No.1です
> No.2の回答の通り言語仕様にないそうです
少し違います。
言語仕様に入れるか判断する際に、他重継承などの問題も含めてtypedefで実現できるので不要と判断されただけです。
例えば、以下のように記載します。
#include <stdio.h>
class A {
public: char func() { return 'A' ;}
};
class B : public A {
typedef A oya;
public: char func() { return oya::func() +1 ;}
};
class C : public B {
typedef B oya;
public: char func() { return oya::func() +1 ;}
};
int main(){
A a;
printf(" %c ",a.func());
B b;
printf(" %c ",b.func());
C c;
printf(" %c ",c.func());
}
返信ありがとうございます
>> No.2の回答の通り言語仕様にないそうです
>少し違います。
これについて「言語仕様にない」ということに対して違うと述べられていますが
回答の残りの部分をみるに、
結局、「言語仕様にはない」ということで理解しました
No.3
- 回答日時:
およそそこに書いてある通りです. 補足しておくと, 「単一継承のときには特殊な形で書けるようにする」という言語仕様も選択できるのですが, そうしなかったということになります.
余談その1.
実は Perl でも多重継承ができてしまう. そうすると「SUPER」を使った場合にどのメソッドを使うかという問題が生じるが, これは Perl の仕様でメソッドの検索順序が決まっている.
余談その2.
#1 に書かれているように, 単一継承であれば typedef することによって「擬似的に」同じように書くことができる. で, 例えば
template <typename Base>
struct DEFINESUPERAS : Base {
typedef Base SUPER;
};
というテンプレートを作ってやれば,
class Derived : public DEFINESUPERAS<Base> {
// ここでは Base を SUPER で参照できる
};
のような技も可能だったりする (完全にこれでいいかはわからないけどこんな感じでいけるはず). もっとも, 「本当のクラス名」が必要な場所では使えないので, あくまで「擬似的」でしかないんだけど.
No.2
- 回答日時:
「親クラスの種類によらず、同じように記述する」ことができると, 逆に「親クラスが複数ある」場合に困る. そのため, 言語仕様には存
在しない.回答ありがとうございます
>そのため, 言語仕様には存在しない.
以下のものと同じことでしょうか
https://srad.jp/~j3259/journal/399424/
引用:「よく考えてみたら C++ は多重継承してるから名指しするしか方法がない。」
言語仕様にないということが分かりました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
Java
-
型Containerのメソッドadd(S...
-
a href="..." とServlet
-
内部クラスのインスタンスを外...
-
リフレクション
-
C# インターフェイスの実装
-
Java リフレクションについて
-
visual studioのデザイナ画面で...
-
ネストしたenumへのリフレクシ...
-
C#にて別クラスの関数を使いたい
-
構造 他のクラスの構造体を別...
-
c++,ある関数のクラスから別の...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
中学のクラス数
-
0歳児の指しゃぶりに関して
-
スーパークラスからサブクラス...
-
変数名の付け方
-
標準モジュールとクラスモジュ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#にて別クラスの関数を使いたい
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
Java リフレクションについて
-
import と extends について
-
C# インターフェイスの実装
-
構造 他のクラスの構造体を別...
-
範囲外の数値を代入したらエラ...
-
C#でほかのファイルにある自作...
-
C#のクラスライブラリでメッセ...
-
親クラスから子クラスへアクセス。
-
Tomcatのpropertiesファイルの...
-
java-別クラスの変数の使い方を...
-
C++でfriendクラスにしているの...
-
継承したクラス側のクラス名の取得
-
dynamic_castの必要性
-
ネストしたenumへのリフレクシ...
-
Java
-
ASP Pageの孫継承のPage_Load
おすすめ情報