Странное поведение с C ++ / CLI и сборками друзей - PullRequest
1 голос
/ 03 августа 2010

Я пишу две сборки C ++ / CLI. Одна сборка имеет базовый класс с некоторыми внутренними виртуальными методами. Другая сборка помечена как дружественная и содержит производный класс.

Когда я пытаюсь переопределить внутренний виртуальный метод, компилятор заставляет меня изменить уровень видимости на public.

Что происходит? Зачем мне это делать?

Код:

// 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
        {
        }
    };
}

1 Ответ

0 голосов
/ 04 августа 2010

Потому что другие классы в FriendAssemblyBase могут вызывать BaseClass.DoSomething.

Принцип замещения Лискова говорит, что все, что можно сделать с базовым классом, должно быть выполнимо с каждым производным классом. Do DerivedClass.DoSomething должно быть видимым для FriendAssemblyBase. Единственный способ, которым это может случиться, это public:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...