【问题标题】:Weird behavior with C++/CLI and friend assembliesC++/CLI 和友元程序集的奇怪行为
【发布时间】:2010-08-03 14:42:27
【问题描述】:

我正在编写两个 C++/CLI 程序集。一个程序集有一个带有一些内部虚拟方法的基类。另一个程序集被标记为友元并包含派生类。

当我尝试覆盖内部虚拟方法时,编译器强制我将可见性级别更改为公共。

发生了什么事?为什么我必须这样做?

代码:

// Assembly 1 "FriendAssemblyBase"
namespace FriendAssemblyTest
{
    public ref class BaseClass
    {
    internal:
        BaseClass()
        {
        }

        virtual void DoSomething()
        {
        }
    };
}

// Allow "FriendAsseblyDerived" to see internals
[assembly:  ::System::Runtime::CompilerServices::InternalsVisibleToAttribute(
"FriendAssemblyDerived, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a95fe809ecc53c3a826aa32e3ab1309f2ecae4b91dc649457d704e150f3a4007a151ffe28852f947803dd1a1586c5c0ae2c9688bd76299857ee65ff7efb14905e03b33664a42e2fa1074080c3bad971623514ab6dd9fc4e4343ba7fb98884ecce45f96b71e5f1b55de88e36483274aa71c740fdfb14aacaada6ca22cb39bf9a2")];

// ----------------
// Assembly 2. "FriendAssemblyDerived". Strongly named and signed
#using "FriendAssemblyBase.dll" as_friend
namespace FriendAssemblyTest
{

    public ref class Derived : BaseClass
    {
    public:
        Derived() {}

        void Foo()
        {
            DoSomething();
        }

    internal: // <-- Causes C3252 (cannot reduce visibility of virtuals)
        virtual void DoSomething() override
        {
        }
    };
}

【问题讨论】:

  • 您能否提供一对虚拟类来演示您的类如何相互派生/包含?
  • 我添加了一些代码来说明。
  • “发布属性声明”的哪一部分不清楚?再见。
  • 添加了“属性声明”。不确定该细节将如何帮助任何人回答问题...

标签: .net c++-cli


【解决方案1】:

因为FriendAssemblyBase中的其他类可以调用BaseClass.DoSomething。

Liskov 替换原则说,可以用基类完成的任何事情都必须可以用于每个派生类。 DerivedClass.DoSomething 必须对 FriendAssemblyBase 可见。可能发生的唯一方法是使用public:。

【讨论】:

  • 但是不能直接调用自己的虚函数吗?这与受保护的可见性有何不同?
  • FriendAssemblyBase中的其他类,不一定是BaseClass本身,可以调用该函数。受保护的情况并非如此。
猜你喜欢
  • 2010-10-06
  • 2017-01-17
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 2014-09-18
  • 2020-09-03
  • 2016-12-27
相关资源
最近更新 更多