- 主题:虚基类指针怎样指向派生类对象的变量
对的。
【 在 here080 的大作中提到: 】
:
: 不合理需求。
: 或者说,你想当成结构体用的,就不应该搞虚基类和继承。
:
: C++的类有两种:
--
FROM 114.242.250.*
没看明白,啥意思?
【 在 cheaper2005 () 的大作中提到: 】
: 比如A,B都是纯虚基的派生类, 有一个基类指针pC,
: pC执行A或B中虚函数没有问题,有没有办法能不能pC访问A,B中的变量,比如A中的a,B中的b
:
: 我的应用场景是:A,B其实都是些结构体,想利用多态变成class,但其实还是当做struct使用,
--
FROM 124.217.189.*
你这不叫虚基类,虚基类是虚继承的基类
【 在 cheaper2005 (cheaper and more powerful) 的大作中提到: 】
: 比如A,B都是纯虚基的派生类, 有一个基类指针pC,
: pC执行A或B中虚函数没有问题,有没有办法能不能pC访问A,B中的变量,比如A中的a,B
中的b
: 我的应用场景是:A,B其实都是些结构体,想利用多态变成class,但其实还是当做
struct使用,
: ...................
--
FROM 124.64.16.*
【 在 chenjy (cjy) 的大作中提到: 】
: 你这不叫虚基类,虚基类是虚继承的基类
钻石段位要懂钻石继承。开个玩笑。for your convenience:
#include <stdio.h>
#define VIR virtual
struct X { int x; };
class Y1 : VIR public X { int y1; };
class Y2 : VIR public X { int y2; };
class Z : public Y1, public Y2 {};
int main() {
Z* z = new Z;
Y1* p = z;
Y2* q = z;
z->Y1::x = 3;
printf("%lu %p %p %p %p %p\n", sizeof(Z), z, p, q, &(p->x), &(q->x));
return 0;
}
32 0xde6c20 0xde6c20 0xde6c30 0xde6c3c 0xde6c3c
#define VIR
16 0x19d0c20 0x19d0c20 0x19d0c28 0x19d0c20 0x19d0c28
看sizeof(z)没什么意义, 应该看sizeof(Z)
你说的对。路上想起来好像都是8,回来后也发现把Z写成z了,更新了。virtual的时候32出乎我的意料。我在onlinegdb试的,应该是gcc,版本不知道。
https://zhuanlan.zhihu.com/p/145900846
--
修改:billybear04 FROM 106.121.71.*
FROM 106.121.71.*
搞C++10年了,从没自己写过虚基类,或者做过基于虚基类的设计,应该很常见吧。 这玩意知道就行了,用起来真是得好好考虑是不是真的场景契合。 记得有本书就说过,基于虚拟继承的好设计几乎都是由一个人在一个特定模块内完成。
不过LZ的这个例子也不是虚基类啊。 A,B完全不同,在运行时又要得到不同的行为,用函数重载不是更好吗? 高级一点的话就是相同的逻辑放在模板,模板内再通过函数重载实现差异化处理。
--
FROM 1.91.32.*
这样的结构体有几十个,变成类后,虚函数的行为完全一样,最理想的使用多态的场景。代码调用简洁太多了。
但是有几个结构有些变量不一致,如果基类指针能够直接访问这些变量,代码有会简洁很多。 downcast我没有成功,现在已处理好了,派生类指针强制转换就能搞定,但是不够完美。
你搞了10年C++没用过多态还是很有些缺点什么的,我见过很多人用C++其实还是C的写法,不奇怪
获得这些结构体
【 在 hongdiao (hongdiao) 的大作中提到: 】
: 搞C++10年了,从没自己写过虚基类,或者做过基于虚基类的设计,应该很常见吧。 这玩意知道就行了,用起来真是得好好考虑是不是真的场景契合。 记得有本书就说过,基于虚拟继承的好设计几乎都是由一个人在一个特定模块内完成。
: 不过LZ的这个例子也不是虚基类啊。 A,B完全不同,在运行时又要得到不同的行为,用函数重载不是更好吗? 高级一点的话就是相同的逻辑放在模板,模板内再通过函数重载实现差异化处理。
--
FROM 211.103.207.*
没有写清楚, C是纯虚类
【 在 chenjy (cjy) 的大作中提到: 】
: 你这不叫虚基类,虚基类是虚继承的基类
: 中的b
: struct使用,
: ...................
--
FROM 211.103.207.*
那叫抽象基类。而且你这个问题压根跟纯不纯虚没关系。
【 在 cheaper2005 的大作中提到: 】
:
: 没有写清楚, C是纯虚类
:
: --
:
发自「今日水木 on SM-G9730」
--
FROM 124.64.19.*
【 在 cheaper2005 的大作中提到: 】
: 这样的结构体有几十个,变成类后,虚函数的行为完全一样,最理想的使用多态的场景。代码调用简洁太多了。
: 但是有几个结构有些变量不一致,如果基类指针能够直接访问这些变量,代码有会简洁很多。 downcast我没有成功,现在已处理好了,派生类指针强制转换就能搞定,但是不够完美。
: 你搞了10年C++没用过多态还是很有些缺点什么的,我见过很多人用C++其实还是C的写法,不奇怪
: ...................
我说自己没写过虚基类,你怎么就觉得我没用过多态呢, 虚基类和多态是两码事啊。。。
前面都有人回你了, 你对所谓虚基类的理解是错误的。你把普通的继承/多态表述成虚基类了,但是C++里面的虚基类不是这个概念。 先找一本C++的书看看什么是虚基类和虚拟继承吧。
--
修改:hongdiao FROM 1.91.32.*
FROM 1.91.32.*
搞定了就好。
不过你的描述太含糊。
一行代码顶十行描述。
【 在 cheaper2005 () 的大作中提到: 】
: 这样的结构体有几十个,变成类后,虚函数的行为完全一样,最理想的使用多态的场景。代码调用简洁太多了。
: 但是有几个结构有些变量不一致,如果基类指针能够直接访问这些变量,代码有会简洁很多。 downcast我没有成功,现在已处理好了,派生类指针强制转换就能搞定,但是不够完美。
:
: 你搞了10年C++没用过多态还是很有些缺点什么的,我见过很多人用C++其实还是C的写法,不奇怪
--
FROM 138.19.103.*