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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- モテる・モテたい 好きな人に名前で呼ばれたい… 3 2022/06/04 14:42
- 学校 私、夏休み中に毎日アイプチで跡付けして二重になったんですよ。 そしたら先生に、「メイクしてるよね?」 4 2022/08/29 21:39
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- モテる・モテたい 好きな人に呼ばれたい呼び名。 1 2022/06/04 19:09
- 防犯・セキュリティ 学校セコムの仕組みについて 今日の部活後、最寄り駅に着いたところスマホを学校に忘れたことに気づき、戻 7 2022/07/18 13:50
- 友達・仲間 文化祭の準備に行くべきか悩んでいます。 高校生女子です。 私は不登校気味で、終業式にも行けませんでし 6 2022/07/21 13:04
- 韓国語 韓国人同士の呼びかけ方 2 2022/06/16 21:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
関数内の変数に<summary>コメン...
-
Java リフレクションについて
-
範囲外の数値を代入したらエラ...
-
visual studioのデザイナ画面で...
-
C++でfriendクラスにしているの...
-
c++,ある関数のクラスから別の...
-
JSPでbeanプロパティ(配列)を...
-
アップキャスト、ダウンキャス...
-
explicitの定義は?
-
ひとつのファイルにクラスは1つ?
-
Java
-
C#で処理中の状況をStatusLabel...
-
VisualC++でクラスのヘッダーフ...
-
構造 他のクラスの構造体を別...
-
親クラスから子クラスへアクセス。
-
プログラムの変数名にするとど...
-
スーパークラスのコンストラク...
-
継承したクラス側のクラス名の取得
-
javaの配列について質問です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#にて別クラスの関数を使いたい
-
c++,ある関数のクラスから別の...
-
親クラスから子クラスへアクセス。
-
C#でほかのファイルにある自作...
-
クラス間でのデータ参照
-
構造 他のクラスの構造体を別...
-
範囲外の数値を代入したらエラ...
-
ひとつのファイルにクラスは1つ?
-
C++でfriendクラスにしているの...
-
Java リフレクションについて
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
java-別クラスの変数の使い方を...
-
C#のクラスライブラリでメッセ...
-
visual studioのデザイナ画面で...
-
C# log4netの使い方
-
a href="..." とServlet
-
アップキャスト、ダウンキャス...
-
オブジェクトのデータをもとにX...
おすすめ情報