【发布时间】:2016-01-15 19:40:21
【问题描述】:
在我的具体情况下,我有一个基类“Base”,其中有一个数据成员“A_var”。我希望任何派生类都只能以 const 访问该数据成员,在语法上与“Base”类相同。
如果它是受保护的或私有的,则派生类分别具有完全访问权限或无访问权限。我可以将其设为私有,并创建一个返回 const 引用的受保护函数,但是访问在语法上会有所不同。
class Base {
protected:
const type_t& A() const {return A_var;}
private:
type_t A_var;
void f();
};
class Derived : public Base{
public:
void g();
};
//access in Base class
void Base::f() {
type_t value = A_var;
A_var = value;
}
//access in Derived class
void Derived::g() {
type_t value = A();
A() = value; //Error, const reference; good
}
重载 'A()',如下所示,也不起作用,因为 'Derived' 类调用私有非 const 'A()'。
protected:
const type_t& A() const {return A_var;}
private:
type_t& A() {return A_var;}
微小的差异可能看起来没什么大不了的,但在我的代码中,有各种宏以访问该数据成员开始。因此,我必须为“基”类和派生类设置不同的宏,这会破坏代码的读取和写入流程。
更新: 澄清一下,问题在于使派生类和基类中的访问权限相同,语法。也就是说,例如,我可以调用一个函数 f(),并让它在基类中调用时返回一个非常量引用,但在派生类中调用时返回一个 const 引用。动机是使派生类中的强制 const 访问无缝。我意识到可能没有办法做到这一点,但我问以防万一。
更新: 举一个真实的例子(这样的案例有2-3个),在代码中使用了很多:
test_files_var.current()->current_test()
我把它换成了
#define TEST() test_files_var.current()->current_test()
因为派生类将通过不同的函数/成员(即testFiles())访问test_files_var,所以我必须对TEST() 进行第二个定义,即DTEST()。这个问题更多地取决于“宏”的使用次数,而不是它们的数量。
【问题讨论】:
-
“但在我的代码中有各种宏......” 这可能是严重设计缺陷的根源。避免使用宏。
-
这不会违反
Liskov substitution principle吗? -
@πάνταῥεῖ 也许你是对的。但是,它们并不是很长的宏,并且“各种”可能正在推动它。举一个真实的例子(其中有 2-3 个),这在代码“test_files_var.current()->current_test()”中被大量使用。我用#define TEST() test_files_var.current()->current_test() 替换了它。因为派生类将通过函数访问 test_files_var,即 testFiles(),所以我必须有 TEST() 的第二个定义,即 DTEST()。这个问题更多地取决于“宏”的使用次数,而不是它们的数量。
-
@VladFeinstein 我刚刚快速阅读了 Liskov 替代原理的定义,所以我的回答持保留态度,但我认为不是。 Base 类甚至是抽象的,派生类中没有接口函数。
-
@Ramon 您可能应该在您的问题帖子中介绍这些附加信息(而不是 cmets),以便更清楚您的实际用例是什么。
标签: c++