gpt4 book ai didi

c++ - Visual Studio 2008 中的嵌套继承问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:09 25 4
gpt4 key购买 nike

我目前正在开发基于小部件的图形用户界面。它的结构是一棵树,Widget 是叶子,Container 是树的节点。这种结构的(可解决的)问题是 Widget 类引用了作为其父级的 Container。然而,这使得 Container 类无法访问 Widget 类的 protected 成员(这里的“draw”成员造成了麻烦)。

这是导致问题的核心代码。当然这可以通过公开成员来解决。然而,这不是我想要的风格。

类测试.h:

class Container;

class Widget {
public:
Widget(Container *parent);
virtual ~Widget();

protected:
Container *parent;

virtual void draw();
};

class Container : public Widget {
public:
Container(Container *parent);
virtual ~Container();

protected:
std::list<Widget *> childs;

private:
friend Widget::Widget(Container *);
friend Widget::~Widget();

virtual void draw();

void addChild(Widget *child);
void removeChild(Widget *child);
};

类测试.cpp

#include "stdafx.h"
#include "ClassesTest.h"

Widget::Widget(Container *parent) {
this->parent = parent;
parent->addChild(this);
}

Widget::~Widget() {
parent->removeChild(this);
}

void Widget::draw() {
//Draw the leaf
}


Container::Container(Container *parent) : Widget(parent) {}

Container::~Container() {}

void Container::draw() {
//Draw all the childs

for (std::list<Widget *>::iterator i = childs.begin(); i != childs.end(); i++) {
(*i)->draw();
}
}

void Container::addChild(Widget *child) {
childs.push_back(child);
}

void Container::removeChild(Widget *child) {
childs.remove(child);
}


int main(int argc, char* argv[])
{
//Do something useful!
return 0;
}

这是我尝试编译代码时 Visual Studio 2008 给我的输出:

1>------ Build started: Project: ClassesTest, Configuration: Debug Win32 ------
1>Compiling...
1>ClassesTest.cpp
1>e:\visual studio 2008\projects\classestest\classestest\classestest.cpp(26) : error C2248: 'Widget::draw' : cannot access protected member declared in class 'Widget'
1> e:\visual studio 2008\projects\classestest\classestest\classestest.h(14) : see declaration of 'Widget::draw'
1> e:\visual studio 2008\projects\classestest\classestest\classestest.h(6) : see declaration of 'Widget'
1>Build log was saved at "file://e:\Visual Studio 2008\Projects\ClassesTest\ClassesTest\Debug\BuildLog.htm"
1>ClassesTest - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

如有任何建议,我们将不胜感激!

菲利普

最佳答案

关于您的具体问题,您的代码基本上等同于此:

class Base
{
protected:
virtual void f() {}
};

class Derived : public Base
{
void h()
{
Base().f(); // no can do - Base() creates another instance.
f(); // sure, why not. it's the same instance, go ahead.
Derived().f(); // sure, why not. it's the same type, go ahead.
}
};

问题在于,虽然Derived 继承自Base,但它仍然无法访问Base 的 protected 成员。此处访问权限的工作方式如下:

    如果 Base 是不同的实例,
  1. Derived 可以访问 Base 的 protected 内容。
  2. Derived 可以在它自己的实例中访问 Base 的 protected 内容。
  3. Derived 可以访问另一个 Derived 的私有(private)内容。

解决问题的最快方法可能是使 Container::draw() 成为 Widget 的 friend 。

关于c++ - Visual Studio 2008 中的嵌套继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7622275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com